• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 访问属性时损坏 NSManagedObject 派生对象

[复制链接]
菜鸟教程小白 发表于 2022-12-13 13:25:08 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有一个类,它在某些时候通过核心数据获取获取一堆数据,然后将在 XCode 中以通常的核心数据方式创建并因此从 NSManagedObject 派生的对象插入到NSMutableSet。根据事情的进展情况,其中一些对象可能最终会出现在其他几个集合中。到目前为止,一切都很好。

但随后发生了以下情况:

NSMutableArray* anArray = [NSMutableArray alloc] init;
[currentResults minus:previousResults]; // both are NSMutableSets
for(MyObject* obj in currentResults)
{
   [anArray addObject:[createAnnoFromMyObjectbj]]; // nastiness happens here
}

createAnnoFromMyObj: 所做的只是从 obj 中提取数据并返回一个实现 MKAnnotation 的对象。

问题是,虽然我得到了一组可用的注释,currentResultspreviousResults 以及任何其他引用任何 MyObject 的对象> 被 createAnnoFromMyObject: 触及的 > 最终会被丢弃。

我的意思是尝试访问它们会导致异常

-[MyObject beginningOfDocument]: unrecognized selector sent to instance...

当尝试使用 po 命令在调试器 Pane 中查看任何这些集合时,也会发生同样的情况。

我们尝试在 Core Data 中重新生成 MyObject,但没有成功。 Google 上很少提及这个 beginningOfDocument 选择器,我们也不知道可能出了什么问题。虽然我们有一个可能会消除此问题的解决方法,但很高兴知道发生了什么。



Best Answer-推荐答案


我还遇到了这个特定的无法识别的选择器问题 - 在 iOS5.x 中我的(子类)NSManagedObject 实例上调用了 beginningOfDocument。不过,这个问题似乎在 iOS6 中得到了解决。我还证实了 NSZombies 没有给我任何东西,尽管它看起来确实是正确的直觉。

在我们的托管对象的 valueForKey 查找过程中引发了无法识别的选择器异常,因此值得查看堆栈跟踪,看看这是否也是为您引发异常的地方。

在我们的例子中,“损坏”的键是 fullText,我们的属性之一的名称。改名就解决了这个问题。我的猜测是该名称导致底层 sqlite 查询出错(我不认为全文是关键字,但可能是在 sqlite 中搜索全文?),也许查询参数在 iOS6 中得到了更好的清理。

您可以通过这个小技巧找出哪些键/属性名称被破坏:将您的 valueForKey: 方法临时覆盖到 NSLog,然后调用父类(super class)版本并返回它。即使文档说不要覆盖它(我们只是做了片刻以找到有问题的属性),这没关系,因为我们只是覆盖然后调用父类(super class)实现。

// Don't forget to remove me after the bug is fixed!
- (id)valueForKeyNSString *)key {
    NSLog(@"Finding value for key: %@", key);
    return [super valueForKey:key];
}

然后当你再次运行时,你会看到崩溃前对 valueForKey: 的最后一次调用,并且知道哪个属性名称被破坏了。

如果您仍然无法确定哪个是不成功的查找,您可以选择更详细的:

// Don't forget to remove me after the bug is fixed!
- (id)valueForKeyNSString *)key {
    NSLog(@"Finding value for key: %@", key);
    id retVal = [super valueForKey:key];
    NSLog(@"Success for key: %@", key); // or print retVal for fun
    return retVal;
}

关于ios - 访问属性时损坏 NSManagedObject 派生对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10339067/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap