访问 NSManagedObject 会导致 EXC_BAD_ACCESS
Posted
技术标签:
【中文标题】访问 NSManagedObject 会导致 EXC_BAD_ACCESS【英文标题】:Accessing a NSManagedObject causes EXC_BAD_ACCESS 【发布时间】:2012-08-27 18:20:09 【问题描述】:更新:整理问题并使其更清晰
我收到EXC_BAD_ACCESS
在NSManagedObject
上崩溃。
我有一个 Sentence
托管对象,我将它传递给模态视图 (addStoryItem
),如下所示:
addStoryItem.sentence = (Sentence*)[fetchedResultsController objectAtIndexPath:indexPath];
AddStoryItem
设置为保留Sentence
:
@property (retain) Sentence *sentence;
有时用户需要做一些显示另一个模式的事情(在addStoryItem
之上)——这不会影响这个对象,但它确实需要一个 NSMutableSet 的副本——sentence.audiosets
如果他们确实查看了此模式,则每当我尝试访问或设置句子对象或其属性时,一旦用户返回到 addStoryItem,我就会得到一个 EXC_BAD_ACCESS
下面是对发生的事情的简单总结:
用户在表格视图中选择行 我从表中获取对象并设置模态的句子属性,然后使用 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 属性