2011-10-12 120 views
1

我在XCode 4中得到Instrument工具报告ASIHttpRequest发生内存泄漏......我无法弄清楚问题所在,把我的所有代码都处理完了,然后像下面那样创建函数,但是xcode仍然报告相同的内存泄漏...仪器(XCode4)报告ASIHttpRequest泄漏内存?

每次点击按钮时都会调用此方法,并且每次点击按钮时都会发生更多内存泄漏。 :(

- (void) loadData 
{ 
    // no data set, we need to load ourself 
    NSURL *url = [self getDataUrl]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 

    //////////////////////////////////////////////////////////////////// 
    // set cache policy 
    // 

    // always store data in cache 
    [request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy]; 
    // Always ask the server if there is new content available, 
    // If the request fails, use data from the cache even if it should have expired. 
    [request setCachePolicy:ASIAskServerIfModifiedWhenStaleCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy]; 


    [request setCompletionBlock:^{ 
     NSLog(@"[http request] finishing %@", url); 

     [self dataDidLoadSuccess]; 
    }]; 

    [request setFailedBlock:^{ 
     NSError *error = [request error]; 
     NSLog(@"[http request]Failed to perform request to %@: %@", url, error); 
     [self dataDidLoadFail:error]; 
    }]; 

    [request startAsynchronous]; 
} 

以下是从仪器复制检测泄漏(只是一部分):

Leaked Object # Address Size Responsible Library Responsible Frame 
__NSMallocBlock__,2 <multiple> 64 Bytes UIKit -[UIViewController view] 
NSCFString,2 <multiple> 64 Bytes CFNetwork HTTPMessage::parseHeadersFromData() 
GeneralBlock-16,2 <multiple> 32 Bytes Foundation -[NSThread main] 
NSRecursiveLock,2 <multiple> 160 Bytes Foundation +[NSRecursiveLock allocWithZone:] 
NSConcreteMutableData,2 <multiple> 64 Bytes Foundation +[NSMutableData(NSMutableData) allocWithZone:] 
__NSArrayM,2 <multiple> 64 Bytes UIKit -[UIViewController view] 
__NSMallocBlock__,2 <multiple> 64 Bytes UIKit -[UIViewController view] 
__NSArrayM,2 <multiple> 64 Bytes Foundation +[NSHTTPCookie _cf2nsCookies:] 
__NSOperationInternal,2 <multiple> 288 Bytes Foundation -[NSOperation init] 
NSCFString,  0xb35fdc0 16 Bytes CFNetwork createCapitalizedHeaderString 
NSCFString,  0xb35fda0 32 Bytes CFNetwork HTTPMessage::extractResponseStatusLine(unsigned char const*, long) 
GeneralBlock-32, 0xb35cd10 32 Bytes CFNetwork HTTPMessage::internalSetHeader(__CFString const*, __CFString const*, long) 
__NSCFArray, 0xb35c550 32 Bytes CFNetwork HTTPReadStream::streamEvent(unsigned long) 
GeneralBlock-48, 0xb35c520 48 Bytes CFNetwork HTTPReadStream::startRequest(CFStreamError*) 
GeneralBlock-16, 0xb35c440 16 Bytes CFNetwork HTTPReadStream::startRequest(CFStreamError*) 
__NSCFInputStream, 0xb35c420 32 Bytes CFNetwork HTTPReadStream::startRequest(CFStreamError*) 
GeneralBlock-32, 0xb35ba80 32 Bytes CFNetwork HTTPReadStream::constructProxyList(CFStreamError*) 
__NSCFArray, 0xb35ba60 32 Bytes CFNetwork HTTPReadStream::constructProxyList(CFStreamError*) 
GeneralBlock-48, 0xb35ba10 48 Bytes CFNetwork HTTPMessage::initialize(HTTPMessage*) 
CFHTTPMessage, 0xb35b950 80 Bytes CFNetwork HTTPReadStream::streamOpen(__CFReadStream*, CFStreamError*, unsigned char*) 
GeneralBlock-48, 0xb35b920 48 Bytes Foundation -[NSThread main] 
__NSCFArray, 0xb35b900 32 Bytes CFNetwork HTTPMessage::initialize(HTTPMessage*) 
__NSCFArray, 0xb35b8e0 32 Bytes Foundation -[NSThread main] 
__NSCFArray, 0xb35b8c0 32 Bytes CFNetwork HTTPReadStream::startRequest(CFStreamError*) 
GeneralBlock-48, 0xb35b610 48 Bytes Foundation -[NSThread main] 
GeneralBlock-16, 0xb35b5f0 16 Bytes CFNetwork HTTPReadStream::streamSetProperty(__CFReadStream*, __CFString const*, void const*) 
GeneralBlock-32, 0xb35b5d0 32 Bytes Foundation -[NSThread main] 
GeneralBlock-32, 0xb35b5b0 32 Bytes Foundation -[NSThread main] 
NSCFString,  0xb35b590 32 Bytes Foundation -[NSURL(NSURL) host] 
GeneralBlock-16, 0xb35b570 16 Bytes CFNetwork HTTPReadStream::streamSetProperty(__CFReadStream*, __CFString const*, void const*) 
__NSCFDictionary, 0xb35b540 48 Bytes Foundation -[NSThread main] 
__NSCFDictionary, 0xb35b490 48 Bytes CFNetwork 

Screenshot

+0

后scrrenshot ... – iAmitWagh

+0

附截图,我用手动快照,快照后,每次我调用“loadData”。 –

回答

8

我不知道,如果这是你的问题有或没有,但要报价http://allseeing-i.com/ASIHTTPRequest/How-to-use#using_blocks

__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 

注意当我们声明请求时使用__block限定符,这个很重要, !它告诉该块不保留该请求,其中 在防止保留周期中很重要,因为请求将始终保留该块。

所以尝试添加__block预选赛,并重新测试,看看您是否仍然有问题...仪器屏幕的

+0

非常感谢!它是固定的!通过添加__block,所有问题都消失了! –

+0

再一次,我应该RTFM :( –