访问NSManagedObject会导致EXC_BAD_ACCESS

时间:2012-08-27 18:20:10

标签: objective-c uitableview core-data memory-management nsmanagedobject

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

我在EXC_BAD_ACCESS上遇到NSManagedObject次崩溃。

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

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

AddStoryItem设置为保留Sentence

@property (retain) Sentence *sentence;

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

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

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

以下是对所发生情况的简单总结:

  • 用户选择tableview中的行
  • 我从表中获取对象并设置模态的句子属性,然后使用fetchedResultsController显示模态
  • 我显示一个字符串,图像并将句子中的nsset设置为模态的
  • 如果用户需要修改nsset,则会显示另一个模式,并带有第一个nsset的副本(不会更改或访问句子对象)
  • 如果我在关闭第二个模态(或NSLOG句子)后尝试在句子中设置属性 - EXC_BAD_ACCESS

据我所知,我有句话。 addStoryItem的其他属性仍然在内存中徘徊 - 但当我试图达到它时句子不存在。是的,我在addStoryItem的dealloc中释放了句子 - 但是没有被调用(我有一个日志语句)。

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

1 个答案:

答案 0 :(得分:1)

您正在sentenceToUpDate中创建新的didSelectRowAtIndexPath:。当然,只要你不采用这种方法,这个参考就会被遗忘。

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

self.sentence = [fetchedResultsController objectAtIndexPath:indexPath];

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

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

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