我如何找到因为缺少 NSAutoreleasePool 而泄漏的线程?

Posted

技术标签:

【中文标题】我如何找到因为缺少 NSAutoreleasePool 而泄漏的线程?【英文标题】:How do I find the thread that is leaking because it lacks an NSAutoreleasePool? 【发布时间】:2011-10-10 15:04:43 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

您可以在 __NSAutoreleaseNoPool 上设置一个符号断点,然后在您点击它时查看您在哪个线程上。这可以使用 Xcode 的 Breakpoint Navigator 底部的 UI 来完成,如果您愿意,也可以在 GDB 命令行上输入以下命令:break __NSAutoreleaseNoPool

【讨论】:

【参考方案2】:

来自MallocStackLogging的CocoaDev:

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

然后你可以循环一些动作,看看是否有 泄漏迭代之间的变化。泄漏有一个 id,它保持 相同的应用程序的生命周期,大小和有时猜测 被泄露对象的类型,以及开始位的转储 泄露的数据。

弄清楚如何最好地修复漏洞,以及如何解释其中的一些问题 您在泄漏转储中看到的内容是另一回事。

【讨论】:

【参考方案3】:

只需在线程的主函数中添加一个自动释放池即可解决您的内存管理问题。 像这样

- (void)main

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    ...
    Your code here
    ...

    [pool release];

或者如果你想使用新的语法

- (void)main

    @autoreleasepool 
        ... your code here ...
    

无论如何,您应该检查所有由工厂方法创建或由您明确自动发布的 NSDate。下面列出了 NSDate 类的所有工厂方法

日期

dateWithNaturalLanguageString:

dateWithNaturalLanguageString:locale:

dateWithString:

dateWithTimeIntervalSinceNow:

dateWithTimeInterval:sinceDate:

dateWithTimeIntervalSinceReferenceDate:

dateWithTimeIntervalSince1970:

(来自Apple documentation)

【讨论】:

以上是关于我如何找到因为缺少 NSAutoreleasePool 而泄漏的线程?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Oracle中找到两个大小范围之间缺少的大小范围?

为 Android 构建 Chromium 时缺少/未找到 android_gyp

如何修复 cocoapod .modulemap 文件未找到

Matplotlib - 如何使用文档找到特定需求?

for循环中缺少return语句

缺少 Chrome 动画按钮