在KVC編程方式中,無論調用setValue:forKey:方法,還是調用valueForKey:方法,都是通過NSString對象來指定被操作屬性,其中forKey:標簽用戶傳入屬性名的。
對于setValue:屬性值forKey@“name”;代碼,底層的執行機制如下。
(1)程序優先考慮調用“setName:屬性值;”代碼通過setter方法完成設置。
(2)如果該類沒有setName:方法,KVC機制會搜索該類名為_name的成員變量,無論該成員變量是在類接口部分定義,還是在類實現部分定義,也無論用哪個訪問控制符修飾,這條KVC代碼頂層實際上就是對_name成員變量賦值。
(3)如果該類既沒有setName:方法,也沒有定義_name成員變量,KVC機制會搜索該類名為name的成員變量,無論該成員變量是在類接口部分定義,還是在類實現部分定義,也無論用哪個訪問控制符修飾,這條KVC代碼頂層實際上就是對name成員變量賦值。
(4)如果上面3條都沒有找到,系統將會執行該對象的setValue:forUndefinedKey:方法。
對于valueForKey:@name;代碼,底層的執行機制如下。
(1)程序優先考慮調用“name;”代碼來獲取該getter方法的返回值。
(2)如果該類沒有name方法,KVC機制會搜索該類名為_name的成員變量,無論該成員變量是在類接口部分定義,還是在類實現部分定義,也無論用哪個訪問控制符修飾,這條KVC代碼頂層實際上就是返回_name成員變量的值。
(3)如果該類既沒有name方法,也沒有定義_name成員變量,KVC機制會搜索該類名為name的成員變量,無論該成員變量是在類接口部分定義,還是在類實現部分定義,也無論用哪個訪問控制符修飾,這條KVC代碼頂層實際上就是返回name成員變量的值。
(4)如果上面3條都沒有找到,系統將會執行該對象的valueForUndefinedKey:方法。
提示:
(1)默認的setValue:forUndefinedKey:方法和valueForUndefinedKey:方法實現就是引發一個異常,這個異常將會導致程序因為異常結束。如果不想因為不存在key而結束程序,可以重寫這兩個方法。
(2)當程序嘗試為某個屬性設置nil值時,如果該屬性并不接受nil值,那么程序將會自動執行該對象的setNilValueForKey:方法。如果為了自行制定這個行為,可以通過重寫setNilValueForKey:方法實現。
新聞熱點
疑難解答