【发布时间】:2012-04-26 13:02:51
【问题描述】:
一个典型的自定义访问器方法可以写成如下:
- (NSString *)name
{
[self willAccessValueForKey:@"name"];
NSString *myName = [self primitiveName];
[self didAccessValueForKey:@"name"];
return myName;
}
- (void)setName:(NSString *)newName
{
[self willChangeValueForKey:@"name"];
[self setPrimitiveName:newName];
[self didChangeValueForKey:@"name"];
}
setPrimitiveName的意思很清楚了。它允许您在没有 KVC 的情况下访问“原始”变量(防止访问器内部的运行循环)并设置传入的值。同样的观察可以应用于 getter。
从文档中可以清楚地看出,setPrimitiveName 禁用更改通知方法:willChangeValueForKey 和对应方法。
现在我的问题是:为什么需要将该方法包装在 willChangeValueForKey: 和 didChangeValueForKey: 方法中?
阅读Core Data编程有这么写:
NSManagedObject 禁用自动键值观察 (KVO) 更改 建模属性和原始访问器的通知 方法不调用访问和更改通知方法。为了 未建模的属性,在 Mac OS X v10.4 Core Data 上也禁用 自动KVO;在 Mac OS X v10.5 及更高版本上,Core Data 采用 NSObject 的行为。
为什么我需要通知我已准备好访问密钥(访问器或实例变量),然后我已经完成了它?谁被告知?
希望我的问题很清楚。提前谢谢你。
【问题讨论】:
标签: ios core-data key-value-observing accessor kvc