分离的 NSThread 内存泄漏

Posted

技术标签:

【中文标题】分离的 NSThread 内存泄漏【英文标题】:Detached NSThread memory leak 【发布时间】:2011-04-23 17:48:41 【问题描述】:

使用仪器,我在这种分离线程的方法中遇到了内存泄漏:

-(void)goToThisUrl:(id) targetUrl

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    if (someCondition) 
        // Doing some stuff here
    
    // Instruments show memory leak on data
    else 
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString: targetUrl]];
        myTargetImage = [UIImage imageWithData:data];
        // When releasing data(because data retainCount = 2), i got:
        // Incorrect decrement of the reference count of an object that is not owned at this point by the caller
        //[data release];
       
    [pool release];

我不明白这个泄漏。

谢谢。

【问题讨论】:

【参考方案1】:

下意识的可能性,因为该代码中没有内存所有权问题:

如果有人在其他地方保留但未正确释放 myTargetImage,则数据可能会泄漏,Instruments 会向您显示指示的位置,因为它报告对象的创建位置,而不是泄漏的位置 “在大多数情况下,UIKit 类只能在应用程序的主线程中使用。” (source);除非你有特定的授权 UIImage +imageWithData 是安全的(我找不到任何东西,但苹果已经很难找到这种细节)那么你所做的在技术上是非法的,并且像泄漏这样的功能奇怪应该不足为奇。

【讨论】:

what you're doing is technically illegal:为什么?此图像不会保留在其他地方。谢谢。 这是一个分离的线程。这不是主线。因此,如果您没有该特定权限,那么您将明确无视 Apple 的“UIKit 类只能在应用程序的主线程中使用”的指示。在这种情况下,所有赌注都被取消。 好的,这个泄漏怎么办?我该如何处理? 根据我的回答:泄漏可能在该代码段之外的其他地方,或者是您的不安全线程策略的结果。您似乎假设后者是一个不相关的问题;没有理由支持这一点。 @vince:根据文档,您的线程无效。您依赖于无证行为。争辩说“显然可以忽略文档,因为我的代码工作正常,除了 - 你知道 - 它没有”是站不住脚的。问题可能不在于线程,但你不能肯定地说它不是,即使忽略自己承担它来猜测 Apple 的实施并忽略他们的直接指示的多种其他后果。

以上是关于分离的 NSThread 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

是否需要分离 pthread 以防止内存泄漏?

在 Chrome 开发工具中查找 JS 内存泄漏

jQuery/Sizzle checkContext 内存泄漏

如何使用 Chrome 和 DevTools 查找影响页面性能的内存问题,包括内存泄漏内存膨胀和频繁的垃圾回收

SGI STL内存配置器存在内存泄漏吗?

文档 Dom 树与分离的 Dom 树?