我对此做了一些小实验。
我创建了一个名为isFault的布尔属性。您知道,这是NSManagedObject的一种方法,因此实际上由于KVC而不允许使用属性名称。
简单地说,我在此测试中使用了默认的Core Data模板,但是以编程方式创建了数据模型,因此我可以向您展示我的工作。
所以我们走了:
NSAttributeDescription *badAttr = [[NSAttributeDescription alloc] init];
[badAttr setName:@"isFault"];
[badAttr setAttributeType:NSBooleanAttributeType];
[badAttr setOptional:YES];
// don't want to occupy you with the whole, non-important rest ...
接下来,我修改了控制器的-insertNewObject方法,添加了这些行:
// Assume: An managed object is created into the context, but not saved yet...
NSLog(@"isFault = %d", [newManagedObject isFault]); // 0 = NO
BOOL isFault = [[newManagedObject valueForKey:@"isFault"] boolValue];
NSLog(@"isFault = %d", isFault); // 0 = NO
[newManagedObject setValue:[NSNumber numberWithBool:YES] forKey:@"isFault"];
isFault = [[newManagedObject valueForKey:@"isFault"] boolValue];
NSLog(@"isFault = %d", isFault); // 0 = NO
您可以看到,我无法将isFault属性设置为YES。它仍然是NO。现在,将属性名称更改为isFaultXYZ将允许。
实际上,我想问的是......因为这些东西似乎依赖于KVC,规则是否仅适用于返回并且没有参数的方法?返回什么数据类型是否重要?例如,-changedValues没有参数并返回NSDictionary。但由于没有类似的属性类型,这会不会引起碰撞?
答案 0 :(得分:0)
所以,这是证据。在命名属性changedValues时,在尝试通过KVC访问它时会发生这种情况:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFDictionary boolValue]: unrecognized selector sent to instance 0x1205680'
2010-06-10 14:52:40.232 CoreData[33996:207] Stack: (
8035,
4437,
8825,