开发者

iOS UITableView random crash

I have a problem I can't locate clearly, maybe you can help me...

I have an iPad project, based on UINavigationController, most (but not all) of controllers inside are instances of UITableViewController, and everything works well...

Everything excepting that my application crashes randomly, sometimes after 10 minutes of use, sometimes after only 10 seconds... It never crashes on the same view, never at the same time, making that difficult to reproduce.

In addition, it only seams to happen on device, I've never got this crash in the simulator.

The debugger doesn't help me very much, here is what it says: -[UITableView autorelease]: message sent to deallocated instance 0x8e9800

And here is the call stack: http://i.stack.imgur.com/JSCHx.png

Any idea ? Thanks (and sorry开发者_如何转开发 for my english)


You're overreleasing a UITableView somewhere in your code. Are you calling release or autorelease on the UITableView inside one of your UITableViewControllers? You should only release objects that you 'own'. You get to own an object by using methods beginning with alloc, new, copy, or retain.

Please read the cocoa memory management guidelines for more info.

Useful links:

http://www.cocoadev.com/index.pl?MemoryManagement

http://www.cocoadev.com/index.pl?RulesOfThumb


At some point you are either releasing a UITableView instance that you do not own or you are failing to retain one at some point where you keep a reference to it (e.g. you store it in an ivar or a property declared assign rather than retain).


I have written about how to debug things like this on my blog:

http://loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html

Basically, try these three things first:

  1. Do a Build an Analyze and fix everything you see
  2. Turn on Zombies, run your code -- it will tell you if you talk to dealloced objects
  3. If that fails, try Debug Malloc, but that's way harder.


I apologize, after re-reading all my source code, I found ONE ViewController (I have around 20 ViewController), where I released an Outlet, in ViewDidUnload.

The reason that it crashed randomly is that I didn't understood well the mechanism of ViewDidUnload, it is called to release views (but not objects of controllers) when memory is low and view is not visible (ex: First ViewController of a NavigationController), and the views are re-loaded when the ViewController become visible again...

In simulator, memory is rarely an issue so ViewDidUnload is almost never called...

Problem fixed, thank you everyone for your help


To help with making sense of the trace, see iOS Debugging Magic (Technical Note TN2239) and Understanding and Analyzing iPhone OS Application Crash Reports (Technical Note TN2151).

Jeff

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜