我有一个具有如下属性的模型:
当我设置其值时,例如:
model.isResolved = @YES;
保留在模型中的NSNumber“忘记”它是一个布尔值:
NSLog(@"%@", strcmp([self.isResolved objCType], @encode(BOOL)) == 0 ? @"equal" : @"different");
打印“不同”。这是怎么回事?
答案 0 :(得分:3)
答案 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来避免这种情况)