核心数据布尔属性NSNumber不记得它的布尔值

我有一个属性如下所示的模型:

在这里输入图像说明

当我确定它的价值时,例如:

model.isResolved = @YES; 

保存在模型中的NSNumber“忘记”它是一个布尔值:

 NSLog(@"%@", strcmp([self.isResolved objCType], @encode(BOOL)) == 0 ? @"equal" : @"different"); 

打印“不同”。 这是怎么回事?

这是怎么回事?

从文档 :

请注意,数字对象不一定保留它们所创build的types。

这是cocoa的另一个不一致的优化。

核心数据为被pipe理对象类的所有属性(和关系)dynamic生成getter和setter方法。 这些访问器方法不同于通常由实例variables备份的@synthesized访问器方法。

特别是,如果您设置了属性,然后再次检索属性值,则可以获取与“原始”对象不同的对象 。 以下testing显示了这一点, foo1是一个具有布尔属性“show”的Core Data实体的实例:

 NSNumber *yes = @YES; NSLog(@"yes = %p, type = %s", yes, [yes objCType]); foo1.show = yes; NSNumber *val = foo1.show; NSLog(@"val = %p, type = %s", val, [val objCType]); 

输出:

 yes = 0x16e595c, type = c val = 0x744c150, type = i 

所以,即使您将属性设置为c = char编码的数字,getter方法也会返回i = int编码的数字。

这个testing是在iOS模拟器中完成的。 有趣的是,在OS X 64位上运行的相同testing返回一个c = char编码的数字。

因此,核心数据对象中布尔和其他标量属性的实际编码应该被视为核心数据的实现细节。

如果您需要检查模型中定义的核心数据types,则可以使用对象实体描述而不是objCType

 NSEntityDescription *entity = [foo1 entity]; NSAttributeDescription *attr = [[entity attributesByName] objectForKey:@"show"]; NSAttributeType type = [attr attributeType]; if (type == NSBooleanAttributeType) { NSLog(@"Its a Boolean!"); } 

它存储为NSNumber – 通过@YES的方式创build一个NSNumber像

[NSNumber numberWithBool:YES]

所以为了让布尔回来你做:

[isResolved boolValue]

(您可以通过在创build模型时勾选“使用标量属性”来避免此情况)