是否仍然可以为NSObject或NSManagedObject的任何非参数方法命名属性和关系是个坏主意?

时间:2010-06-10 12:51:40

标签: iphone core-data

我对此做了一些小实验。

我创建了一个名为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。但由于没有类似的属性类型,这会不会引起碰撞?

1 个答案:

答案 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,