gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:15:54 25 4
gpt4 key购买 nike

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

但接下来会发生以下情况:

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

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

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

我所说的垃圾是指尝试访问它们会导致异常

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

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

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

最佳答案

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

无法识别的选择器异常是在对我们的托管对象进行 valueForKey 查找时抛出的,因此值得查看堆栈跟踪以查看是否这也是为您抛出异常的地方。

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

你可以用这个小作弊找出哪个键/属性名称被破坏了:暂时将你的 valueForKey: 方法覆盖到 NSLog ,然后调用父类(super class)版本并返回它。尽管文档说不要覆盖它(我们只是暂时这样做以找到有问题的属性),但这没关系,因为我们只是覆盖然后调用父类(super class)实现。

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

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

如果您仍然无法找出哪个是不成功的查找,您可以使用更详细的:

// Don't forget to remove me after the bug is fixed!
- (id)valueForKey:(NSString *)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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com