KVC 和 KVO
KVC
- (Key Value Coding),鍵值編碼,通過鍵值(字符串)來訪問屬性的機制,來間接修改屬性值
- 使用方法
- 賦值?
setValue:forKey:
- 例如:
[person setValue:@"Jack" forKey:@"name"];
,執行這個方法時會優先調用setName:方法,如果沒有這個方法,則會直接修改name或者_name這個成員變量
- 例如:
- 取值?
valueForKey:
- 例如:
id name = [person valueForKey:@"name"];
,執行這個方法時會優先調用name方法,如果沒有這個方法,則會直接讀取name或者_name這個成員變量
- 例如:
- 賦值?
KVO
- (Key Value Observing),監聽模型屬性值的改變
//cc監聽了aa的name屬性的改變
[aa addObserver:cc forKeyPath:@"name" options: NSKeyValueObservingOptionOld context:nil];// cc得實現監聽方法 /** * 當監聽到object的keyPath屬性發生了改變 */ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSLog(@"監聽到%@對象的%@屬性發生了改變, %@", object, keyPath, change); } //退出時移除監聽的屬性 - (void)dealloc { [self.p1 removeObserver:self forKeyPath:@"name"]; }
- KVO是基于Runtime機制實現的
- 當對象執行完addObserver:forKeyPath: options:context:后,系統會在運行期動態創建一個新的子類,并將對象的isa指針指向該類,該類會重寫set方法,set方法里面先實現super的set方法,再調用監聽器的observeValueForKeyPath: ofObject: change: context:方法通知監聽器屬性值發生改變
?推薦拓展閱讀