我正在使用ARC开发一个iOS5应用程序,我开始得到一些我无法弄清楚的随机EXEC_BAD_ACCESS崩溃。随机我的意思是它非常不可预测:有时可能需要很长时间才能崩溃,有时会短暂。而且也没有一个特定的按钮/ tablecell /等。触发崩溃。每次用户交互都可能导致应用程序崩溃,但您无法重复崩溃。
我试图打开NSZombie以及一些malloc调试工具。在Instruments中,崩溃错误读取:Objective-C消息被发送到地址为0x10bd1b40的解除分配对象(僵尸)。引用计数日志的最后一部分如下所示:
475 CoursesFirstViewController Release 2 02:23.253.631 0 UIKit -[UINibDecoder finishDecoding]
476 CoursesFirstViewController Release 1 02:23.253.838 0 Foundation -[NSAutoreleasePool drain]
477 CoursesFirstViewController Zombie -1 02:35.752.420 0 Foundation objectHash
2,1,1,-1是参考计数。我不知道为什么它会跳过0并降为-1,从而导致程序崩溃(所有条目但最后一条都有连续的引用计数)。我也不知道objectHash是什么。
我的应用程序包含多个功能,可在主屏幕上作为图标访问。 CoursesFirstViewController是其中一个功能。总是,它是CoursesFirstViewController和objectHash使应用程序崩溃,即使我在其他地方。 (这是上面的日志的情况:我在02:23离开了CoursesFirstViewController(因此返回到我的应用程序的主屏幕),但是在12秒之后,当我在其他一些功能时,应用程序崩溃了)我只需要输入CourseFirstViewController,搞砸了一下,然后去其他地方继续使用该应用程序,过了一会儿就会崩溃。
我现在真的很生气。我已经搜索了SO和Google很长一段时间但找不到解决方案。任何帮助将非常感激。谢谢!
答案 0 :(得分:2)
@robmayoff是的,我已经检查了但是没有看到任何特别有用的东西。最后几个调用是objectHash,hashProbe,[NSConcreteHashTable rehashAround],[NSConcreteHashTable removeItem]等。
这实际上有点用处。这告诉我们一个集合,可能是NSDictionary
,但可能是NSSet
正在被销毁。从您之前的信息来看,它似乎是在nib实例化过程中创建的自动释放的集合(因此可能是CoursesFirstViewController
的ivar)。无论如何,这都是我在寻找症状的地方,但崩溃似乎证实了这一点。
一般建议是审核任何__bridge
演员表或unsafe_unretained
属性。
另一个预感是你以违反Cocoa内存管理的方式命名了一个方法。最可能的错误是您拥有以new
或copy
开头的属性。如果您有ARC代码调用错误名称的非ARC代码,这肯定会成为一个问题。
答案 1 :(得分:0)
我怀疑你的某个属性标记为“弱”,它应该是“强大的”并且超出范围并在访问之前获得释放。在这种情况下,ARC无法保存您,您将获得上述随机崩溃行为。
如果你没有找到任何运气,我会在你的项目中进行全局搜索“弱”属性,并仔细检查每个属性,以确保它不是你想要的东西。这很乏味但老实说不需要花很长时间才能完成,有时会比一个错误更多。
答案 2 :(得分:0)
我从您的仪器输出中收集到僵尸对象的类型为CoursesFirstViewController
。我们经常使用视图控制器作为其他对象的委托,并且大多数拥有委托的对象都不会保留其委托。
我假设您没有使用任何unsafe_unretained
属性或变量,或任何retain
类型属性。所以我假设你的任何对象都没有保留对CoursesFirstViewController
僵尸的悬空引用。
由于系统库必须使用非ARC代码,因此它们不使用ARC的弱引用。因此,如果某个系统对象具有CoursesFirstViewController
作为其委托,并且CoursesFirstViewController
被销毁但系统对象不被销毁,那么系统对象将留下对被破坏对象的悬空引用。
因此,请检查您是否使用CoursesFirstViewController
作为任何系统对象的委托。如果是这样,您确定这些对象的寿命不会超过CoursesFirstViewController
吗?