使用乐器我在这段代码上有内存泄漏,我不明白为什么!
-(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];
}
由于
答案 0 :(得分:3)
以上没有泄漏。 可能是您删除的部分中的一个或多个泄漏,并替换为“someCondition”和“在这里做一些事情”,但除非您发布,否则此处没有人可以提供帮助完全您正在使用Instruments测试的代码。
另外:“//释放数据时(因为数据retainCount = 2)......”停止。对。那里。忽略retainCount。您释放一个对象是因为您使用隐含所有权的方法创建了该对象,或者因为您保留了该对象。您从不释放对象只是因为其retainCount具有您不期望或不理解的值。有关详细信息,请阅读Apple的Memory Management Programming Guide。
答案 1 :(得分:0)
首先,你不能在第二个线程中分配UIImage。 UIKit的使用需要在主线程上。我假设你想通过创建另一个线程来做的是调用dataWithContentsOfURL而不阻塞主线程。但是,这不是正确的方法。相反,使用带有异步回调的NSURLConnection,在下载完成时调用该异步回调。 Apple已经提供了NSURLConnection在幕后使用的内置“下载”线程。因此,您创建另一个下载线程的方法毫无意义。