在KVC編程方式中,無論調(diào)用setValue:forKey:方法,還是調(diào)用valueForKey:方法,都是通過NSString對象來指定被操作屬性,其中forKey:標(biāo)簽用戶傳入屬性名的。
對于setValue:屬性值forKey@“name”;代碼,底層的執(zhí)行機(jī)制如下。
(1)程序優(yōu)先考慮調(diào)用“setName:屬性值;”代碼通過setter方法完成設(shè)置。
(2)如果該類沒有setName:方法,KVC機(jī)制會搜索該類名為_name的成員變量,無論該成員變量是在類接口部分定義,還是在類實(shí)現(xiàn)部分定義,也無論用哪個訪問控制符修飾,這條KVC代碼頂層實(shí)際上就是對_name成員變量賦值。
(3)如果該類既沒有setName:方法,也沒有定義_name成員變量,KVC機(jī)制會搜索該類名為name的成員變量,無論該成員變量是在類接口部分定義,還是在類實(shí)現(xiàn)部分定義,也無論用哪個訪問控制符修飾,這條KVC代碼頂層實(shí)際上就是對name成員變量賦值。
(4)如果上面3條都沒有找到,系統(tǒng)將會執(zhí)行該對象的setValue:forUndefinedKey:方法。
對于valueForKey:@name;代碼,底層的執(zhí)行機(jī)制如下。
(1)程序優(yōu)先考慮調(diào)用“name;”代碼來獲取該getter方法的返回值。
(2)如果該類沒有name方法,KVC機(jī)制會搜索該類名為_name的成員變量,無論該成員變量是在類接口部分定義,還是在類實(shí)現(xiàn)部分定義,也無論用哪個訪問控制符修飾,這條KVC代碼頂層實(shí)際上就是返回_name成員變量的值。
(3)如果該類既沒有name方法,也沒有定義_name成員變量,KVC機(jī)制會搜索該類名為name的成員變量,無論該成員變量是在類接口部分定義,還是在類實(shí)現(xiàn)部分定義,也無論用哪個訪問控制符修飾,這條KVC代碼頂層實(shí)際上就是返回name成員變量的值。
(4)如果上面3條都沒有找到,系統(tǒng)將會執(zhí)行該對象的valueForUndefinedKey:方法。
提示:
(1)默認(rèn)的setValue:forUndefinedKey:方法和valueForUndefinedKey:方法實(shí)現(xiàn)就是引發(fā)一個異常,這個異常將會導(dǎo)致程序因?yàn)楫惓=Y(jié)束。如果不想因?yàn)椴淮嬖趉ey而結(jié)束程序,可以重寫這兩個方法。
(2)當(dāng)程序嘗試為某個屬性設(shè)置nil值時,如果該屬性并不接受nil值,那么程序?qū)詣訄?zhí)行該對象的setNilValueForKey:方法。如果為了自行制定這個行為,可以通過重寫setNilValueForKey:方法實(shí)現(xiàn)。
新聞熱點(diǎn)
疑難解答
圖片精選