tableviewcontroller与子detailViewController崩溃与神秘的EXC_BAD_ACCESS

时间:2011-06-30 06:20:37

标签: ios exc-bad-access

我有一个父表视图控制器,上面有一个readonly详细视图控制器属性,它懒惰地实例化一个详细视图控制器。如果我在iphone / ipod上,我会在选择表格中的项目时配置并推送详细视图控制器。当详细视图可见并且我在导航控制器中单击两次时,细节控制器然后弹出父控制器并调用父级的dealloc。当父的dealloc到达我调用[detailViewController release]的行时,我从导航控制器中获得EXC_BAD_ACCESS崩溃。这让我觉得我的问题在于detailViewController的内存管理,但是使用NSZombies调试没有显示任何问题。 (注释掉[detailViewController release]行会导致崩溃消失但是我从来没有一个版本来平衡detailViewController的alloc - memorey leak)任何想法为什么我会崩溃?

编辑: 这是崩溃的堆栈跟踪:

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) bt
#0  0x01046a63 in objc_msgSend ()
#1  0x0a9d72a0 in ?? ()
#2  0x0000cb4c in -[MyTableViewController dealloc] (self=0xa956840, _cmd=0x127a9d6) at /Users/nick/Documents/MyApp/Classes/MyTableViewController.m:290
#3  0x00390f1d in -[UINavigationController setDisappearingViewController:] ()
#4  0x0038e4f6 in -[UINavigationController _clearLastOperation] ()
#5  0x0038ee3f in -[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] ()
#6  0x0051be23 in -[UINavigationTransitionView _notifyDelegateTransitionDidStopWithContext:] ()
#7  0x0051cfd2 in -[UINavigationTransitionView _cleanupTransition] ()
#8  0x00308665 in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] ()
#9  0x003084f7 in -[UIViewAnimationState animationDidStop:finished:] ()
#10 0x0200c6cb in run_animation_callbacks ()
#11 0x0200c589 in CA::timer_callback ()
#12 0x01225fe3 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ ()
#13 0x01227594 in __CFRunLoopDoTimer ()
#14 0x01183cc9 in __CFRunLoopRun ()
#15 0x01183240 in CFRunLoopRunSpecific ()
#16 0x01183161 in CFRunLoopRunInMode ()
#17 0x01a5a268 in GSEventRunModal ()
#18 0x01a5a32d in GSEventRun ()
#19 0x002e642e in UIApplicationMain ()
#20 0x00001b28 in main (argc=1, argv=0xbffff070) at /Users/nick/Documents/MyApp/main.m:14

EDIT2: 发生崩溃的dealloc方法:

- (void)dealloc
{
    [context release]; // a managed object context -- when table entries are selected, they get cached in core data
    [tableDataArray release];
    [detailViewController release]; // <-- line 290, this is where it crashes
    [super dealloc];
}

4 个答案:

答案 0 :(得分:1)

你要么:

A)忘记保留存储在detailViewController ivar

中的对象

B)多次发布存储在detailViewController ivar中的对象

因此,当您尝试在detailViewController方法中释放-dealloc时,它已被解除分配并指向无效内存。对于其中一种情况,您应该审核在此类中设置detailViewController值的位置。如果您没有看到它,请将您操作该ivar的代码添加到您的问题中,以便我们检查它。

答案 1 :(得分:0)

听起来与我最近遇到的EXC_BAD_ACCESS崩溃非常相似。

如果我没记错的话Xcode报告它在这一行上崩溃了:

int retVal = UIApplicationMain(argc, argv, nil, nil);

我认为NSZombie报告收到了该消息的CALayer

我猜你的情况可能类似。你能证实这一点吗?

无论如何,我正在研究一个概念验证应用程序,所以我们只是让它泄漏,从来没有实际修复它。我知道这不能解决您的问题,但它可能会给您和其他答复者提供更多信息。我自己也不介意修复这个漏洞,所以我希望这些信息有助于解决它。

答案 2 :(得分:0)

好吧,我最终找出了错误。当我在原始帖子中说我配置并推送详细视图控制器时,我在配置时在详细视图控制器上设置的一个属性中出现内存管理错误(过度释放)详细视图控制器。错误以间接的方式出现,但当我尝试在另一个新的,更简单的VC中重新创建错误时,我抓住了它。

感谢那些提供帮助的人。

答案 3 :(得分:0)

在为其分配值后尝试保留detailViewController。如果它有效,它会在某个地方过度释放。