一个典型的自定义访问器方法可以写成如下:
- (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:
方法中?
阅读那里的核心数据编程是这样写的:
NSManagedObject 对建模属性禁用自动键值观察 (KVO) 更改通知,并且原始访问器方法不会调用访问和更改通知方法。对于未建模的属性,在 Mac OS X v10.4 Core Data 上也禁用了自动 KVO;在 Mac OS X v10.5 及更高版本上,Core Data 采用了 NSObject 的行为。
为什么我需要通知我已准备好访问密钥(访问器或实例变量),然后我已经完成了它?谁被告知?
希望我的问题很清楚。先感谢您。