代码很容易理解,但输出不是。
xcdatamodel编辑器的屏幕:
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上失去了很多时间为什么我没有使用类的属性。
答案 0 :(得分:1)
问题不同,但潜在问题与
相同Core Data NSPredicate "deleted == NO" does not work as expected
调用核心数据属性"已删除"与isDeleted
方法冲突
NSManagedObject
。
在你的情况下,row.deleted
似乎获取字符串属性,
而[row valueForKeyPath:@"deleted"]
返回YES或NO,具体取决于是否
对象已从托管对象上下文中删除。
不幸的是,文档对Core Data属性名称的含义非常模糊
允许,在这种情况下,模型检查员不会发出警告。
另一个例子是"更新",它与isUpdated
方法冲突。