访问 NSManagedObject 会导致 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】访问 NSManagedObject 会导致 EXC_BAD_ACCESS【英文标题】:Accessing a NSManagedObject causes EXC_BAD_ACCESS 【发布时间】:2012-08-27 18:20:09 【问题描述】:

更新:整理问题并使其更清晰

我收到EXC_BAD_ACCESSNSManagedObject 上崩溃。

我有一个 Sentence 托管对象,我将它传递给模态视图 (addStoryItem),如下所示:

addStoryItem.sentence = (Sentence*)[fetchedResultsController objectAtIndexPath:indexPath];

AddStoryItem 设置为保留Sentence

@property (retain) Sentence *sentence;

有时用户需要做一些显示另一个模式的事情(在addStoryItem 之上)——这不会影响这个对象,但它确实需要一个 NSMutableSet 的副本——sentence.audiosets

如果他们确实查看了此模式,则每当我尝试访问或设置句子对象或其属性时,一旦用户返回到 addStoryItem,我就会得到一个 EXC_BAD_ACCESS

有一个当前的托管对象上下文和获取的结果控制器 一切正常,除非我显示模态视图控制器(afaik,它与句子对象没有任何关系) Zombies 已开启,但没有告诉我任何信息(BRAINS?)

下面是对发生的事情的简单总结:

用户在表格视图中选择行 我从表中获取对象并设置模态的句子属性,然后使用 fetchedResultsController 显示模态 我显示一个字符串、图像并设置一个nsset从句子到模态的ui方面 如果用户需要修改 nsset,他们会显示另一个模式,其中包含第一个 nsset 的副本(不会更改或访问句子对象) 如果我在关闭第二个模态(或 NSLOG 句子)后尝试在句子中设置属性 - EXC_BAD_ACCESS

就我而言,我自己的句子。 addStoryItem 的其他属性仍然在内存中徘徊 - 但是当我尝试访问它时,句子不存在。是的,我在 addStoryItem 的 dealloc 中释放了句子——但这没有被调用(我在那里有一个日志语句)。

你能帮忙吗?很高兴提供更多代码或信息。相当沮丧!

【问题讨论】:

当您打开第二个模态时,您的第一个模态可能会被释放。 @mark 我也这么认为——这可能是问题的一部分。但是我可以在表格视图中复制错误,所以我认为我一定是在选择要传递的对象时做错了。更新的问题。 哪一行代码会导致 EXC_BAD_ACCESS? 任何行访问 (NSLog) 或设置 [sentence setText:@"foo"] 句子对象。在 tableView 示例中,NSLog@"sentenceToUpdate: %@" 行。 在尝试使用之前检查 fetchedResultsController 是否为 nil。 【参考方案1】:

您正在didSelectRowAtIndexPath: 中创建一个新的sentenceToUpDate。当然,一旦您退出该方法,该参考就会被遗忘。

相反,您应该将检索到的对象分配给您的保留属性,如下所示:

self.sentence = [fetchedResultsController objectAtIndexPath:indexPath];

现在应该按预期保留实例。

另一个可能的罪魁祸首是您的NSSet 副本。尝试创建一个新的NSSet 以确保您没有影响实体:

NSSet *setToBePassedToModal = [[NSSet alloc] 
                                initWithSet:entity.toManyRelationship];

【讨论】:

感谢您的回答,但运气不佳 - 我按照您的建议更改了作业 addStoryItem.sentence = [fetchedResultsController objectAtIndexPath:indexPath];但我仍然有同样的问题。

以上是关于访问 NSManagedObject 会导致 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

创建 NSManagedObject 子类导致链接器错误重复符号

合并具有相同属性但 ID 不同的 NSManagedObject,与 iCloud 同步会导致重复(Core Data,Swift 1.2)

调用 NSManagedObject 函数会中断,但在访问变量时不会中断

在 Swift 中访问 NSManagedObject 属性

NSManagedObject 子类导致 NSInvalidArgumentException

NSManagedObject 的 KVO 方法调用外部二进制数据属性导致表格视图滚动迟缓,为啥?