UIkit:[UIViewController mutableChildViewControllers] 崩溃?

21

最近我从iTunes Connect收到了一份崩溃报告。实际上,这是我从成千上万的用户中唯一收到的崩溃报告。这是一个iPod4,1设备。有趣的部分如下:

Date/Time:       2012-02-27 22:53:27.596 +0800
OS Version:      iPhone OS 5.0.1 (9A405)
Report Version:  104

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Last Exception Backtrace:
0   CoreFoundation                  0x338958bf __exceptionPreprocess + 163
1   libobjc.A.dylib                 0x303891e5 objc_exception_throw + 33
2   UIKit                           0x31259749 -[UIViewController mutableChildViewControllers] + 1
3   UIKit                           0x31259349 -[UINavigationController pushViewController:animated:] + 37
4   MyApp                           0x000081e5 -[MyListController tableView:didSelectRowAtIndexPath:] (MyListController.m:207)
5   UIKit                           0x312d3565 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 945
6   UIKit                           0x3134bce7 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 159

当从表视图中选择一行并将新的视图控制器推入导航时,似乎发生了崩溃。根据我的代码,新的视图控制器已经被创建,所以崩溃发生在UINavigationController中。

看起来不像是我编写的代码出了问题。我想知道我的想法是否正确?如何调试这个问题?


2
这是我的iPad...有没有找到任何解决办法? - Jason
4
从崩溃日志来看,问题似乎源于myListViewController.m文件中第207行所做的调用,在tableView:didSelectRowAtIndexPath:方法内部。很可能是正在尝试推送一个不再内存中的视图控制器。您能否发布myListViewController类中tableView:didSelectRowAtIndexPath:方法的代码? - Mark Armstrong
很明显,这个方法只是将一个新的视图控制器推入了导航栈中。我认为这很明显,因为崩溃发生在“push”期间。 - He Shiming
5
我觉得你的语气有点粗鲁,请你理解我是在尝试帮忙。我的意思是:如果你在你的应用程序中加入捕捉机制并发布更新,那么如果再次发生类似情况,你就会拥有相关信息。 - Bryan
如果出现内存不足的问题怎么办(即在didReceiveMemoryWarning反应中,视图控制器的视图被释放)?iPod 4只有256兆字节的内存,而且它是retina屏幕,每个屏幕消耗的内存比非retina设备多4倍。 - Nickolay Olshevsky
显示剩余22条评论
2个回答

1

听起来像是用户收到了低内存警告。UINavigationControllers将保留它们的视图,而选项卡则会弹出不可见的视图。然而,低内存代码仍在被调用。在到达该点之前,请检查您的警告处理程序。此外,在所有入口和出口点下,通过硬件菜单点击“模拟内存警告”进行测试。 http://forums.macrumors.com/showthread.php?t=876419展示了当您没有这样做时会发生什么混乱。 iphonedevsdk.com/forum/iphone-sdk-development/14225-uinavigationcontrollers-and-didreceivememorywarning.html有一个很好的评论,可以告诉您如何处理这个问题。

我打赌你的视图控制器加载了一些东西并导致了内存警告。确保用户不能只是堆叠大量项目,并确保您的应用程序经过分析以消除尽可能多的泄漏,以保持应用程序运行。

以上可能不完全正确,但应该与此相关。

最后一点,不要使用ARC。禁止调用超类函数的东西肯定会出问题。如果你理解桥接Core Foundation,那么也许ARC是可以的。我个人尽量避免使用它,因为内存会被苹果的底层随机处理。我见过他们的东西失败太多了。

谢谢指针。实际上,内存警告模拟不会触发此崩溃。我的应用程序本身的内存占用非常小。上次我进行分析时,它仅使用了约6MB的RAM。我确实使用ARC。某些内存可能会被延迟释放。但不太可能达到24MB的限制。 - He Shiming
听起来这是那些罕见情况之一,因为其他东西崩溃了,或者用户是少数能够做到的人。这种事情经常发生。如果您的Shark工具显示内存不足,即使有泄漏,也不会影响它,直到随着时间的推移堆积。祝你开发顺利,我看到你在其他评论中使用了更好的日志工具,应该很方便。 - Stephen J

-1

我明白了!我之前也遇到过同样的问题,在你的代码中似乎是因为按下了一个按钮导致了崩溃!

Last Exception Backtrace:
0   CoreFoundation                  0x338958bf __exceptionPreprocess + 163
1   libobjc.A.dylib                 0x303891e5 objc_exception_throw + 33
2   UIKit                           0x31259749 -[UIViewController mutableChildViewControllers] + 1
3   UIKit                           0x31259349 -[UINavigationController pushViewController:animated:] + 37
4   MyApp                           0x000081e5 -[MyListController tableView:didSelectRowAtIndexPath:] (MyListController.m:207)
5   UIKit                           0x312d3565 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 945
6   UIKit                           0x3134bce7 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 159

这是我的建议:

解决 SIGABRT 的两个方法:

1)SIGABRT 是由于未捕获的运行时异常引起的。当发生这种情况时,调试器控制台或设备控制台会写入一些信息,说明异常的确切原因。您没有向我们展示这段文本。它以“Terminating application due to ...”开头。

请向我们展示这段文本。

2)如果您在调试器中运行应用程序,并在异常抛出函数上设置断点,则应用程序将在抛出异常时停止,这通常足以找出问题所在。转到调试器断点窗格,在左下角有一个控件,单击它可以设置异常断点。


2
嗯...恐怕你误读了我的问题。崩溃报告是从iTunes connect检索到的,它就是这样的。没有控制台访问或者其他方式可以看到更多信息。我必须说,这里没有涉及任何按钮,只有一个列表视图和一个单元格。你提到你遇到了类似的问题,但你没有说你是如何解决这个问题的。 - He Shiming
现在我得从不同的角度来看待它了...iTunes Connect?可能是因为void出现了错误...也许吧...好吧,我不是Xcode中的专家...我正在学习...如果我不能帮忙,请查看开发者论坛,那里一定有线索! - Noah
他的第一点是正确的,但我猜ITunes不会附加日志?...我会投票支持一个indexOutOfBounds :) -- 你在应用程序中手动修改viewControllers堆栈吗? - Daij-Djan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接