问题描述
我有一个 iPhone SDK 应用程序,该应用程序具有多个视图,这些视图会随着用户创建内容而出现和消失.在设备上使用该应用程序一段时间后,我遇到以下崩溃:
I have an iPhone SDK application that has several views that appear and disappear as the user creates content. After using the application on a device for a while, I get the following crash:
Program received signal: "EXC_BAD_ACCESS".
(gdb) backtrace
#0 0x33369ebc in objc_msgSend ()
#1 0x320e5248 in -[UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded] ()
#2 0x338b4a14 in -[NSObject performSelector:withObject:] ()
#3 0x320e5098 in -[UIAnimator stopAnimation:] ()
#4 0x320e4b7c in -[UIAnimator(Static) _advance:] ()
#5 0x320e4a34 in LCDHeartbeatCallback ()
#6 0x34350e60 in HeartbeatVBLCallback ()
#7 0x332e91c0 in IOMobileFramebufferNotifyFunc ()
#8 0x316532f8 in ?? ()
#9 0x33866b50 in __CFMachPortPerform ()
#10 0x338ae52a in CFRunLoopRunSpecific ()
#11 0x338adc1e in CFRunLoopRunInMode ()
#12 0x3434e1c8 in GSEventRunModal ()
#13 0x32002c30 in -[UIApplication _run] ()
#14 0x32001230 in UIApplicationMain ()
#15 0x00002ff8 in main (argc=1, argv=0x2ffff550) at /Developer/svn/MyCompany/iPhone/MyApplication/Other Sources/main.m:14
从跟踪中可以看出,其中唯一提到我的代码的是对 main 的调用.
As you can see from the trace, the only mention of my code in there is the call to main.
我已经从 Xcode 运行 Build and Analyze,并且还设置它从终端运行我的项目上的 clang 分析器,这两者都找不到代码中的任何问题.我正在使用 iOS SDK 的最新版本(我还没有下载 4.1,但我使用的是 4.1 之前发布的版本).
I have run Build and Analyze from Xcode, and also set it up to run the clang analyzer on my project from the Terminal, and both of these cannot find any problems in the code. I am using a very recent release version of the iOS SDK (I have not downloaded the 4.1 yet, but the one I am using is the one that was in release right before 4.1).
另外,我已经用模拟器在 Instruments 中运行了该应用程序,并且该应用程序没有内存泄漏.
Also, I have run the application in Instruments with the Simulator, and the app has no memory leaks.
我将尝试使用 NSZombieEnabled
变量,看看是否有任何发现,但问题是我需要在应用程序崩溃之前使用 30 到 40 分钟左右,并且我怀疑 NSZombieEnabled
甚至可能无法帮助我找到问题.
I am about to try to use the NSZombieEnabled
variable and see if that finds anything, but the problem is that I need to use the application for 30 to 40 minutes or so before it crashes, and I suspect that NSZombieEnabled
may not even help me find the issue.
我所看到的崩溃似乎是模态视图在父视图控制器中调用委托时发生的.父视图控制器然后在关闭模态视图控制器之前进行一些处理.崩溃中有一些对动画和滚动视图的引用,但我不确定我可以做些什么来导致这些出现问题.有人对要寻找的东西有什么建议吗?
It seems like the crashes that I have seen is when a modal view calls a delegate in the parent view controller. The parent view controller then does some processing before dismissing the modal view controller. There is some references in the crash to animating and scroll views, but I am not sure what I could be doing to cause those to have problems. Does anyone have any suggestions for things to look for?
我已将 NSZombieEnabled
标志放入应用程序,在设备上,它会在控制台中显示此消息:
I have put the NSZombieEnabled
flag into the application, and on the device, it comes up with this message in the console:
2010-09-11 17:10:33.970 MyApplication[9321:207] ***
-[MyViewController respondsToSelector:]: message
sent to deallocated instance 0x7489480
据我所知,我将应用程序中使用的委托在我所有类的 dealloc 中设置为 nil,所以我不知道下一步该往哪里看.
As far as I can tell, I am setting the delegates used in the application to nil in the deallocs of all my classes, so I am stuck as to where to look next.
我尝试对此使用malloc_history
pid address命令,但它说找不到进程,我尝试了9321、9321:207和207.另外,如果我尝试使用 MallocStackLogging
变量,程序将无法在设备上运行,我得到一堆 malloc:
无法在控制台中创建堆栈日志目录消息和程序崩溃.
I tried to use the malloc_history
pid address command on this, but it said that it could not find the process, I tried 9321, 9321:207, and 207. Also, if I try to use the MallocStackLogging
variable, the program will not run on the device, I get a bunch of malloc:
unable to create stack log directory messages in the console and a program crash.
哦,顺便说一句,我不能使用僵尸检查仪器,因为它似乎不适用于设备,而且我不能在模拟器中发生同样的崩溃.
Oh, and by the way, I can't use the zombies checking in Instruments, since it does not appear to work with a device, and I can't get the same crash to happen in the Simulator.
推荐答案
堆栈帧 #1 上的 UIScrollView
可能想要通知其委托动画结束,但此时委托已消失.设置 NSZombieEnabled
可能会证实这一点.
The UIScrollView
on stack frame #1 probably wants to inform its delegate about the animation ending, but the delegate is gone at that point. Setting NSZombieEnabled
would probably confirm this.
没有保留委托,因此这是 Cocoa 和 Cocoa Touch 中的常见错误.在您的代码中查找 UIScrollView
或 UITableView
上的委托,并尝试找出可能提前发布的委托.
Delegates are not retained, so this is a common error in Cocoa and Cocoa Touch. Look for delegates on UIScrollView
or UITableView
in your code and try to find out which one might be released before its time.
这篇关于iOS SDK 中的 UIScrollView EXC_BAD_ACCESS 崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!