如何找到泄漏的线程,因为它缺少NSAutoreleasePool?

时间:2011-10-10 15:04:43

标签: objective-c autorelease nsautoreleasepool

我在运行应用时收到此消息:

*** __NSAutoreleaseNoPool(): Object 0xadf5e50 of class __NSDate autoreleased with no pool in place - just leaking

我知道我需要在发生这种情况的线程的开头创建一个NSAutoreleasePool,但我不确定我的代码在哪里发生。是否可以设置一个断点,当有问题的对象被自动释放时将被击中?

3 个答案:

答案 0 :(得分:2)

你可以在__NSAutoreleaseNoPool上设置一个符号断点,看看你点击它时所在的线程。这可以使用Xcode的Breakpoint Navigator底部的UI,或者如果您愿意,可以通过输入命令在GDB命令行上完成:break __NSAutoreleaseNoPool

答案 1 :(得分:1)

来自MallocStackLogging上的CocoaDev:

  

这是一个环境变量。当这个环境变量是   设置,在tcsh(例如)中使用“setenv MallocStackLogging 1”,然后   你可以在那个shell中启动任何应用程序。不要“打开”应用程序,启动它   从壳。执行此操作时,将跟踪所有malloc。然后说,   在另一个shell中,“泄漏”或“泄漏”会给你一个   此时应用程序中可能存在大量漏洞的列表。

     

然后,您可以循环执行一系列操作,并查看是否有数字   迭代之间的泄漏变化。泄漏有一个id,它保持不变   相同的应用程序的生命周期,大小,有时猜测   被泄漏的对象的类型,以及起始位的转储   泄露的数据。

     

确定如何最好地修复泄漏,以及如何解释一些泄漏   你在泄漏转储中看到的东西是另一回事。

答案 2 :(得分:0)

只需在线程的主要功能中添加自动释放池,即可解决内存管理问题。 喜欢这个

- (void)main
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    ...
    Your code here
    ...

    [pool release];
}

或者如果您想使用新语法

- (void)main
{
    @autoreleasepool {
        ... your code here ...
    }
}

无论如何,您应该检查由工厂方法创建的或由您明确自动释放的所有NSDate。 NSDate类的所有工厂方法都列在下面

  • 日期

  • dateWithNaturalLanguageString:

  • dateWithNaturalLanguageString:区域设置:

  • dateWithString:

  • dateWithTimeIntervalSinceNow:

  • dateWithTimeInterval:sinceDate:

  • dateWithTimeIntervalSinceReferenceDate:

  • dateWithTimeIntervalSince1970:

(来自Apple documentation