帮助,我已经被黑客攻击了好几个星期了!我有这个应用程序我在模拟器中开发,我已经做了很多UI的东西,它只是与数据有趣的部分。它在启动后立即启动,大约90%的时间我运行它,它会引发EXC_BAD_ACCESS异常。
我已经注释掉了我的所有发布消息,甚至还添加了一些保留消息,以确保它不会过度发布。奇怪的是,有时我在代码中做的事情会使它工作,然后它会工作,直到我再次进行代码更改。然后我注释掉我添加的新代码,它仍然崩溃。
我已经在网上阅读了十几篇关于此的文章,尝试了他们建议的内容。我设置了断点,仍然无法弄清楚它在哪里。当我在调试器中单击调用堆栈时,显示源代码的唯一位置是主要的底层。
调试器有这个堆栈,但每次崩溃时都会有一点波动。不一致的性质告诉我它有一些自动释放的记忆,但我不知道如何找出它。
0 objc_msgSend
1 ??
2 _CFAutoReleasePoolPop
3 -[NSAutoReleasePool release]
4 _UIApplicationHandleEvent
5 PurpleEventCallback
6 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
7 __CFRunLoopDoSource1
8 __CFRunLoopRun
9 CFRunLoopRunSpecific
10 CFRunLoopRunInMode
11 -[UIApplication _run]
12 UIApplicationMain
13 main
更多事实:
答案 0 :(得分:11)
您需要在代码中启用僵尸对象,并且检查自动释放的对象,并且可能启用调试将有所帮助。
我添加了三个环境变量。
所有这些都设置为YES
这是我所采用路径的链接。
http://www.codza.com/how-to-debug-exc_bad_access-on-iphone
如果您使用的是XCode 4,那么您将在编辑方案弹出窗口的Arguments部分中添加这些。
另外需要注意的是,您应该只释放或自动释放您保留的对象。您可以保留以下对象。
如果您向其他任何对象发送自动释放,您可以随机结束此错误和其他错误。
通常我会释放对象然后将它们设置为nil,这样如果我稍后发布它们,我就不会有任何问题,因为如果你自动释放nil,你就会得到nil。
NSObject *myObject = [incomingObject retain];
// Do something with the object.
[myObject autorelease];
[myObject autorelease]; // This line will end in an error down the line when the object is released past 0, or when the release pool is drained.
myObject = nil;
[myObject release]; // This line will do nothing. no error, no effect.
答案 1 :(得分:0)
最可能的原因是在Autorelease池中添加垃圾或已释放的对象 - 可能在PurpleEventCallback
函数中?