2012-02-03 73 views
0

在Objective-C中,我不知道自定義設置器是否會覆蓋KVO支持(willChangeValueForKey:和didChangeValueForKey;),並且是否需要在自定義設置器中明確包含對這些的調用?定製Setter可以打破KVO模式嗎?打破保留或複製模式?

保留和複製怎麼樣?我是否需要明確包含版本並保留或複製setter中的屬性(保留或複製屬性)(非ARC代碼)?

回答

5

如果您的訪問器採用標準格式(-setFoo:-foo),KVO將自動工作。但是,保留並複製,您需要在自定義訪問器中管理自己。

這是因爲保留和複製是合成訪問器的一部分,而KVO完全基於方法名稱。有關KVO兼容方法命名的完整說明,請查詢here

1

docs狀態:

自動支持由NSObject的提供,在默認情況下適用於通過鍵 - 值編碼兼容 一類的所有屬性。通常,如果您遵循標準Cocoa編碼並命名爲 約定,則可以使用自動更改通知 - 您沒有 可以編寫任何其他代碼。

如果你有一個setter,只要符合命名約定。

關於複製/保留:

- (void)setFoo:(id)bar { 
    @synchronized (self) { // synchronize if you have to, can be omitted in most cases 
    if (bar_ != bar) { // bar_ is the ivar 
     [bar_ release]; // omit in ARC 
     bar_ = [bar copy]; // resp. retain in other variant 
    } 
    } 
} 

如果您的二傳手不符合guildlines看看「手動更改通知」部分。