所以我最近升级到了XCode 4.2,部分原因是因为我需要IOS 5 SDK。
无论如何,当我编译并尝试运行我的应用程序时,我发现它将不再运行。这是因为Core Data实体中的属性现在以某种方式标记为只读。
我没有这样做,除了错误信息之外,我找不到其他证据。
在我的核心数据托管对象中,名为Note:
@interface Note : NSManagedObject
@property (nonatomic, retain) NSString * title;
...
@implementation Note
@dynamic title;
...
稍后 - 以及其他地方 - 在代码中,我尝试这样做:
self.note.title=self.noteTitle.text;
当执行到达此行时,我收到以下错误:
Property 'title' is marked readonly on class 'Note'. Cannot generate a setter method for it.
-[Note setTitle:]: unrecognized selector sent to instance 0x80ae3d0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Note setTitle:]: unrecognized selector sent to instance 0x80ae3d0'
什么????我可以手工编写setter - 错误说它不能为我生成一个 - 但我真的很想了解这里发生的事情。
我确实为该实体重新生成了托管对象文件,但这些文件无效。我也创建了一个新的数据模型,并进行检查以确保没有设置任何不应该的内容。
编辑:我遗漏了一个重要的消息:我在Note(托管对象)上定义了一个类别。在该类别中,我向对象添加了一个协议(MKAnnotation)。我的类别是这样定义的:
@interface Note (Extras) <MKAnnotation>
我之后删除了协议的“需要”,但没有删除引用。当我这样做时,一切都恢复到应有的状态。
所以当我解决了我的问题时,我想知道:将协议添加到托管对象是不好的行为?
感谢。
答案 0 :(得分:4)
MKAnnotation
协议具有只读title
属性:
@property (nonatomic, readonly, copy) NSString *title
..它与您的动态属性以相同名称冲突。
答案 1 :(得分:2)
将协议添加到NSManagedObject
并不错;你想要的原因有很多。