在Objective-C中,我不知道自定義設置器是否會覆蓋KVO支持(willChangeValueForKey:和didChangeValueForKey;),並且是否需要在自定義設置器中明確包含對這些的調用?定製Setter可以打破KVO模式嗎?打破保留或複製模式?
保留和複製怎麼樣?我是否需要明確包含版本並保留或複製setter中的屬性(保留或複製屬性)(非ARC代碼)?
在Objective-C中,我不知道自定義設置器是否會覆蓋KVO支持(willChangeValueForKey:和didChangeValueForKey;),並且是否需要在自定義設置器中明確包含對這些的調用?定製Setter可以打破KVO模式嗎?打破保留或複製模式?
保留和複製怎麼樣?我是否需要明確包含版本並保留或複製setter中的屬性(保留或複製屬性)(非ARC代碼)?
如果您的訪問器採用標準格式(-setFoo:
和-foo
),KVO將自動工作。但是,保留並複製,您需要在自定義訪問器中管理自己。
這是因爲保留和複製是合成訪問器的一部分,而KVO完全基於方法名稱。有關KVO兼容方法命名的完整說明,請查詢here。
的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看看「手動更改通知」部分。
看看Apples Advanced memory management programming,它告訴你如何正確實施你自己的getters/setters: