带有子 detailViewController 的 tableviewcontroller 因神秘的 EXC_BAD_ACCESS 而崩溃
Posted
技术标签:
【中文标题】带有子 detailViewController 的 tableviewcontroller 因神秘的 EXC_BAD_ACCESS 而崩溃【英文标题】:tableviewcontroller with child detailViewController crashing with mysterious EXC_BAD_ACCESS 【发布时间】:2011-06-30 06:20:36 【问题描述】:我有一个父表视图控制器,上面有一个只读的详细视图控制器属性,它懒惰地实例化详细视图控制器。如果我在 iphone/ipod 上,我会在选择表中的项目时配置并推送详细视图控制器。当细节视图可见并且我在导航控制器中单击两次时,细节控制器然后父控制器被弹出并调用父级的dealloc。当父级的 dealloc 到达我调用 [detailViewController release] 的行时,我从导航控制器中遇到 EXC_BAD_ACCESS 崩溃。这让我认为我的问题在于 detailViewController 的内存管理,但使用 NSZombies 进行调试没有问题。 (注释掉 [detailViewController release] 行会使崩溃消失,但是我从来没有发布来平衡 detailViewController 的分配——内存泄漏)任何想法为什么我会发生这种崩溃?
编辑: 这是崩溃的堆栈跟踪:
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
编辑2: 崩溃发生的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];
【问题讨论】:
【参考方案1】:你要么:
A) 忘记保留存储到您的detailViewController
ivar 的对象
或
B) 多次释放存储到您的detailViewController
ivar 的对象
因此,当您尝试在 -dealloc
方法中释放 detailViewController
时,它已经被释放并指向无效内存。对于其中一种情况,您应该审核在此类中设置 detailViewController
值的位置。如果您没有看到它,请将您操作该 ivar 的代码添加到您的问题中,以便我们对其进行检查。
【讨论】:
原来是 B 的变体——过度发布了我在细节视图控制器上的一个属性。但你是对的——EXC_BAD_ACCESS 似乎总是属于这两个类别之一。 酷,很高兴我能帮上忙。如果有机会,请将我的答案标记为已接受,以便其他人正确回答问题。【参考方案2】:听起来与我最近遇到的 EXC_BAD_ACCESS 崩溃非常相似。
如果我没记错的话,Xcode 报告说它在这一行崩溃了:
int retVal = UIApplicationMain(argc, argv, nil, nil);
我认为NSZombie
报告说是CALayer
收到了消息。
我猜你的情况可能类似。你能确认一下吗?
无论如何,我正在开发一个概念验证应用程序,所以我们只是让它泄漏,从未真正修复它。我知道这不能解决您的问题,但它可能会为您和其他回答者提供更多信息。我自己不介意修复这个漏洞,所以我希望这些信息有助于解决它。
【讨论】:
我没有收到 NSZombie 报告的任何内容(即使它已打开),但如果有帮助,我添加了崩溃的堆栈跟踪。 @nick 它在你的 dealloc 中崩溃了。发布 MyTableViewController 的 dealloc 实现可能有助于弄清楚。【参考方案3】:好吧,我最终找出了错误。当我在原始帖子中说我配置并推送详细视图控制器时,我在配置时在详细视图控制器上设置的属性之一中出现内存管理错误(过度释放)详细视图控制器。该错误以一种间接的方式出现,但当我尝试在另一个新的、更简单的 VC 中重新创建该错误时,我发现了它。
感谢那些提供帮助的人。
【讨论】:
【参考方案4】:在为它分配值后尝试保留 detailViewController。如果它有效,它就是某个地方的过度发布。
【讨论】:
以上是关于带有子 detailViewController 的 tableviewcontroller 因神秘的 EXC_BAD_ACCESS 而崩溃的主要内容,如果未能解决你的问题,请参考以下文章
带有 DetailViewController 的 SIGABRT 信号 [重复]
UIView transitionWithView 带有多个xib文件的子视图
如何在没有 UINavigationController 的情况下为 detailViewController 视图设置动画?
显示 DetailViewController 时在哪里为 KVO 添加和删除观察者
为啥 DetailViewController 使用 Tabbar 和 Navigation Controller 弹出到第一个 DetailViewController?