鍵值編碼允許通過字符串鍵名間接訪問對象屬性,打破靜態編譯限制,實現動態屬性存取。核心方法:
valueForKey: 獲取值setValue:forKey: 設置值提供屬性變更通知機制,實現 Model 與 Controller/View 解耦。Controller 觀察 Model 屬性,屬性變更自動觸發回調。
[model addObserver:self
forKeyPath:@"score"
options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
context:nil];
[model setValue:@(newScore) forKey:@"score"];
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([keyPath isEqualToString:@"score"]) {
// 更新 UI
}
}
dealloc 中):
[model removeObserver:self forKeyPath:@"score"];
setValue:forKey:)觸發 KVO,直接賦值(model.score = 10)或訪問實例變量不會觸發。observeValueForKeyPath:ofObject:change:context:。options 決定 change 字典包含新值、舊值、索引、類型等信息。