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

时间:2012-12-25 09:40:50

标签: iphone objective-c ios core-data

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

enter image description here

当我设置其值时,例如:

model.isResolved = @YES;

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

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

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

3 个答案:

答案 0 :(得分:3)

  

这是怎么回事?

来自documentation

  

请注意,数字对象不一定保留使用它们创建的类型。

这是Cocoa中另一个不一致的优化问题。

答案 1 :(得分:2)

Core Data为托管对象类的所有属性(和关系)动态生成getter和setter方法。这些访问器方法不同于由实例变量备份的“常用”@synthesized访问器方法。

特别是,如果您设置属性然后再次检索属性值,则可以获得 与“原始”对象 不同的对象。以下测试显示了这一点,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 编码的数字。

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

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

如果需要检查模型中定义的Core Data类型,可以使用对象实体描述而不是objCType

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

答案 2 :(得分:2)

它存储为NSNumber - 顺便说一下@YES正在创建一个类似

的NSNumber

[NSNumber numberWithBool:YES]

所以为了让bool退出你做的事情:

[isResolved boolValue]

(您可以通过在创建模型时勾选Use Scalar Properties来避免这种情况)