分离的 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 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
jQuery/Sizzle checkContext 内存泄漏