【问题标题】:iPhone development - memory release issueiPhone 开发 - 内存释放问题
【发布时间】:2010-10-03 16:50:48
【问题描述】:

我遇到了释放已释放对象的问题,但我一生都无法找出错误发生的位置。我添加了 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

谢谢。

【问题讨论】:

    标签: iphone memory memory-management


    【解决方案1】:

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

    如果您手动释放注册为自动释放的对象,就会发生这种情况

    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 中的地址)

    另一个选项(不太可能降低运行时性能)是使用带有“Zombies”模板的 Instruments 工具。它将跟踪僵尸并告诉您僵尸的历史,而无需使用 malloc_history 命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多