内存泄漏NSAutoreleasePool

时间:2011-04-23 11:33:15

标签: memory-leaks uiimage nsdata instruments nsautoreleasepool

使用乐器我在这段代码上有内存泄漏,我不明白为什么!

-(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];
}

由于

2 个答案:

答案 0 :(得分:3)

以上没有泄漏。 可能是您删除的部分中的一个或多个泄漏,并替换为“someCondition”和“在这里做一些事情”,但除非您发布,否则此处没有人可以提供帮助完全您正在使用Instruments测试的代码。

另外:“//释放数据时(因为数据retainCount = 2)......”停止。对。那里。忽略retainCount。您释放一个对象是因为您使用隐含所有权的方法创建了该对象,或者因为您保留了该对象。您从不释放对象只是因为其retainCount具有您不期望或不理解的值。有关详细信息,请阅读Apple的Memory Management Programming Guide

答案 1 :(得分:0)

首先,你不能在第二个线程中分配UIImage。 UIKit的使用需要在主线程上。我假设你想通过创建另一个线程来做的是调用dataWithContentsOfURL而不阻塞主线程。但是,这不是正确的方法。相反,使用带有异步回调的NSURLConnection,在下载完成时调用该异步回调。 Apple已经提供了NSURLConnection在幕后使用的内置“下载”线程。因此,您创建另一个下载线程的方法毫无意义。