本文不是技術向的文章,僅記錄小弟我在開發中遇到的各種坑...
1.屬性
先聲明一個只讀屬性name
@property (nonatomic, strong, readonly) NSString *name;
這樣系統只會生成name的Get方法而不會生成name的Set方法
2.原理
簡單來說KVO的實現原理是重寫了屬性的Set方法,在Set方法中發出通知。
而readonly屬性并沒有Set方法,所以KVO會失效。
/// KVO實現原理
- (void)setName:(NSString *)name{
[self willChangeValueForKey:@"name"]; // KVO在調用存取方法之前總調用
[super setValue:name forKey:@"name"]; // 調用父類的存取方法
[self didChangeValueForKey:@"name"]; // KVO在調用存取方法之后總調用
}
3.實現
用KVO監聽readonly屬性,需要在屬性改變的前后手動加上下面兩行代碼
[self willChangeValueForKey:@"name"];
_name = @"Tom";
[self didChangeValueForKey:@"name"];
關于KVO具體的實現原理可以看這篇文章