2011-04-23 37 views
0

随着仪器我得到了这段代码的内存泄漏,我不明白为什么!内存泄漏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]; 
} 

由于

+0

你正在为分离的线程做这件事,对吧? – 2011-04-23 11:37:41

+0

是的,这就是为什么我分配一个NSAutoreleasePool到这个方法:) – vince 2011-04-23 12:45:19

回答

3

有一个在上方没有泄漏。有可能是您删除的部分中的一处或多处泄漏,并以“someCondition”和“在此处做某些事情”取代,但这里没有人可以帮助解决这个问题,除非您发布代码为完整真正用仪器进行测试。

此外:“//释放数据时(因为数据retainCount = 2)...”停止。对。那里。忽略retainCount。你释放一个对象,因为你已经使用隐含所有权的方法创建它,或者因为你保留了它。你永远不会只是因为它的retainCount有一个你没有料到或不明白的值而释放一个对象。有关详细信息,请阅读Apple的Memory Management Programming Guide

0

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