我目前正在开发一款严重依赖核心数据的应用。一世 使用导航控制器来推送和弹出视图。我走的时候 有时在程序导航控制器的堆栈中 崩溃,我收到错误(通常突出显示在 managedObjectContext合成或dealloc):
"Thread 1: Program received signal: "EXC_BAD_ACCESS".
我使用静态分析仪来修复它发现的所有泄漏。
我使用了NSZombie,看起来我的分配上升了,然后当我拉下菜单视图时不要下去。然后,当我点击另一个菜单视图时,我得到两个结果。
0 Category:NSManagedObjectContext EventType:Malloc RefCt:1 Timestamp:00:04.133.722 Address:0x5da0f10 Size:128 RespLib:pua-app RespCaller:-[pua_appAppDelegate managedObjectContext]
1 Category:NSManagedObjectContext EventType:Zombie RefCt:-1 Timestamp:00:16.524.983 Address:0x5da0f10 Size:0 RespLib:pua-app RespCaller:-[OpenersroutinesMenuViewController setManagedObjectContext]
我对这种类型的调试有ZERO经验,但显然托管对象上下文是“不开心”,我的猜测是我没有正确创建或管理上下文,因为它通过菜单传递。这也很有趣,因为MOC没有在这些菜单中被更改,并且在修改它的视图中不会发生此错误。
答案 0 :(得分:1)
首先,泄漏永远不会导致这种崩溃。泄漏是一种不足释放。这些崩溃通常是由于过度释放造成的。
从您的NSZombie
输出中,看起来您的MOC过度释放了。我会查看您处理managedObjectContext的每个位置,并确保正确保留和释放它。第一条规则是使用访问器而不是直接弄乱你的ivars(-init
,-dealloc
和你的访问者除外,它们应该使用ivars)。
这种问题的一个可能原因是多线程。确保您没有从多个线程访问相同的MOC。它们不是线程安全的。
该问题可能与视图或菜单无关。问题很可能是您在未保留的MOC上调用-release
。