iPhone开发 - 内存释放问题

时间:2009-01-27 05:34:24

标签: iphone memory memory-management

我遇到了这个释放已经发布的对象的问题但是在我的生活中找不到错误发生的地方。我添加了NSZombieEnabled标志,这是我在gdb中获得的日志。有人可以告诉我如何解决这个问题,或者找出错误发生的位置。

*** -[CFString release]: message sent to deallocated instance 0x5e4780 
(gdb) where
#0  0x952ff907 in ___forwarding___ ()
#1  0x952ffa12 in __forwarding_prep_0___ ()
#2  0x9260e20f in NSPopAutoreleasePool ()
#3  0x30a564b0 in _UIApplicationHandleEvent ()
#4  0x31563dea in SendEvent ()
#5  0x3156640c in PurpleEventTimerCallBack ()
#6  0x95280615 in CFRunLoopRunSpecific ()
#7  0x95280cf8 in CFRunLoopRunInMode ()
#8  0x31564600 in GSEventRunModal ()
#9  0x315646c5 in GSEventRun ()
#10 0x30a4ec98 in -[UIApplication _run] ()
#11 0x30a5a094 in UIApplicationMain ()
#12 0x00002494 in main (argc=1, argv=0xbfffef9c) at /Users/adminUser/Projects/MyProject/main.m:14

感谢。

1 个答案:

答案 0 :(得分:16)

自动释放池正在尝试释放已释放的对象。

如果您手动释放为自动释放注册的对象

,则会发生这种情况
NSString* foo = [NSString stringWithFormat:@"foo:%d",42];  
[foo release];  /* this release is bad, as this object is already 
registered for autorelease */

您可以使用以下方法查找分配点:

  1. MallocStackLogging, MallocStackLoggingNoCompact环境设置为1。
  2. 运行程序,一旦进入gdb,使用shell中的malloc_history来找出分配的堆栈跟踪:malloc_history <pid> <addr>。 (NSZombieEnabled将在gdb中打印出地址)
  3. 另一个选项(不太可能降低运行时性能)是使用“工具”工具和“Zombies”模板。它将跟踪僵尸,并告诉你僵尸的历史,而不必使用malloc_history命令。