問題:api
Key-value coding是一種可以對屬性/成員變量間接訪問的機制,是一種非正式協議,和setter/getter方法比起來更加靈活,使用字符串做爲key能夠在運行期間改變。bash
常見的api函數
- (void)setValue:(id)value forKey:(NSString *)key;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (id)valueForKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
複製代碼
setValue:(id)value forKeyPath:(NSString *)keyPath 和 setValue:(id)value forKey:(NSString *)key 的區別ui
問題:spa
利用runtime動態生成一個子類,而且讓instance對象的isa指針指向這個全新的子類,當修改instance的屬性時會調用Foundation的_NSSetXXXValueAndNotify函數,在函數中
- willChangeValueForKey:
- 父類原來的setter
- didChangeValueForKey:
內部會觸發監聽器(Oberser)的監聽方法(observeValueForKeyPath:ofObject:change:context:)
複製代碼
手動調用willChangeValueForKey:和didChangeValueForKey:
複製代碼
不會觸發KVO,由於直接修改爲員變量並無走set方法
複製代碼
會觸發KVO,如上流程圖
複製代碼