从KVC返回的无效类 - 混淆了bool值

时间:2014-05-07 15:49:43

标签: objective-c core-data

代码很容易理解,但输出不是。

xcdatamodel编辑器的屏幕:

cl.ly/image/3U0P1W301K06

deleted的类型为String

@interface Row : NSManagedObject
    (...)
    @property (nonatomic, retain) NSString * deleted;
@end

@implementation Row
    (...)
    @dynamic deleted;
@end

代码中的其他地方:

Row *row = [self.fetchedResultsController objectAtIndexPath:indexPath];

NSString* fixedTypeDeletedClassString = NSStringFromClass([row.deleted class]);
NSString* KVCDeletedClassString = NSStringFromClass([[row valueForKeyPath:@"deleted"] class]);

NSLog(@"%@ is %@", row.deleted, fixedTypeDeletedClassString);
NSLog(@"%@ is %@", [row valueForKeyPath:@"deleted"], KVCDeletedClassString);

输出结果为:

2014-05-07 17:29:26.170 iOSplayground[20814:90b] false is __NSCFString
2014-05-07 17:29:26.171 iOSplayground[20814:90b] 0 is __NSCFNumber

为什么属性的类别不同?

类是不同的,但至少看起来像是正确的,但有一个更糟糕的情况:

2014-05-07 17:29:26.172 iOSplayground[20814:90b] true is __NSCFString
2014-05-07 17:29:26.172 iOSplayground[20814:90b] 0 is __NSCFNumber

我一开始没有使用Row类进行快速原型设计,并且使用NSManagedObject和KVC,我在debuging上失去了很多时间为什么我没有使用类的属性。

1 个答案:

答案 0 :(得分:1)

问题不同,但潜在问题与

相同

Core Data NSPredicate "deleted == NO" does not work as expected

调用核心数据属性"已删除"与isDeleted方法冲突 NSManagedObject

在你的情况下,row.deleted似乎获取字符串属性, 而[row valueForKeyPath:@"deleted"]返回YES或NO,具体取决于是否 对象已从托管对象上下文中删除。

不幸的是,文档对Core Data属性名称的含义非常模糊 允许,在这种情况下,模型检查员不会发出警告。 另一个例子是"更新",它与isUpdated方法冲突。