"[copy copyWithZone:]:无法识别的选择器发送到实例时"使用Bindings/Core Data时

Ada*_*dam 30 cocoa core-data cocoa-bindings nsmanagedobject

(自我询问和自我回答,因为我花了几个小时在网上寻找这个,大多数资源都说"我最终解决了它"而没有给出解释)

我有一个非常简单的Core Data + Bindings应用程序:

  • NSArrayController从Core Data中提取项目
  • NSTableView渲染它们
  • 另一个NSTableView,当您单击第一个表中的行时,显示该项的详细信息

上面的第3项导致应用程序崩溃,错误如下:

[(my NSManagedObject) copyWithZone:]: unrecognized selector sent to instance
Run Code Online (Sandbox Code Playgroud)

实现该方法(!)并在那里放置一个断点,我发现它是由Apple的NSCell类调用的 - 这没有多大帮助:(.

Ada*_*dam 25

事实证明以上所有都需要触发这一点,并且XCode允许你在99.9%的情况下做一些错误的事情,如果不是100%的话.

  1. Core-Data对象无法实现copyWithZone: - 这会导致崩溃

  2. 使用Bindings填充tableview时,它会尝试复制NSArrayController中对象的以呈现每个列

  3. ...但是如果你没有完全指定Column绑定(Xcode允许你一半指定它),那么tableview会尝试对象的"复制" 而不是它们的

我的绑定中的错误:我已经指定表列具有"值":

Controller Key ="arrangeObjects"模型键路径=(空白)

(这是XCode4自动完成中的一个错误 - 当你过快地删除时,它会删除ModelKeyPath字段)

完成输入绑定,例如:

模型关键路径="值"

......一切都有效.


小智 8

我也想在这里发帖,因为我遇到了类似问题

空定义的对象:

错误的代码:

@property (nonatomic, copy, readwrite) MSender * sender;
Run Code Online (Sandbox Code Playgroud)

这应该抛出一个编译错误,因为引用计数Xcode不知道如何复制我的对象.相反,它在运行时失败了......

编写代码:

@property (nonatomic, strong, readwrite) MSender * sender;
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助某人.


小智 6

谢谢你的解决方案,它指出了我正确的方向.对于那些学习InterfaceBuilder的人,我希望这些额外的信息有所帮助.

事实证明,在构建教程的过程中,我无意中将一个教程绑定Text field Cell - Text Cell到了我的教程ArrayController.ObjectValue.
真正的约束应该发生在

Table Column > Table Cell View > Static Text - Table View Cell

那一个是正确的,但在视觉上在它下面的树(因为我不明白的原因,IB需要一个Text Field Cell.)我绑定了:

Table Column > Text Field Cell - Text Cell

这是第二个绑定试图复制整个对象,因为路径objectValue没有键,它触发了这个错误.

可能是一个新手的错误,但它意味着通过每一个物体行走和检查绑定,我碰到这个来了一个.