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

분리 된 스레드에 대해이 작업을 수행하고 있습니까? –

+0

예,이 때문에 NSAutoreleasePool을이 메서드에 할당합니다. :) – vince

답변

3

위 내에 누출이 없습니다. 여기에서 으로 삭제하고 "someCondition"및 "Doing some stuff here"로 대체 한 부분에서 하나 이상의 누수가있을 수 있습니다. 코드를 게시하지 않으면 여기 아무도 도움을 줄 수 없습니다. 실제로 Instruments로 테스트합니다.

또한 : "// 데이터를 해제 할 때 (데이터 retainCount = 2) ..."중지. 권리. 그곳에. retainCount를 무시하십시오. 소유권을 암시하는 메서드를 사용하여 개체를 만들거나 개체를 보유했기 때문에 개체를 릴리스합니다. NEVER은 retainCount가 예상하지 못했거나 이해할 수없는 값을 가지고 있기 때문에 개체를 해제합니다. 자세한 내용은 Apple Memory Management Programming Guide을 참조하십시오.

0

먼저, 두 번째 스레드에서 UIImage를 할당 할 수 없습니다. UIKit의 사용은 메인 스레드에 있어야합니다. 다른 스레드를 작성하여 수행하려는 작업이 메인 스레드를 차단하지 않고 dataWithContentsOfURL을 호출하는 것이라고 가정합니다. 그러나 이것은 올바른 접근 방식이 아닙니다. 대신 다운로드가 완료되면 호출되는 비동기 콜백과 함께 NSURLConnection을 사용하십시오. Apple은 이미 NSURLConnection이 백그라운드에서 사용하는 내장 "다운로드"스레드를 제공합니다. 따라서 다운로드 할 다른 스레드를 만드는 방법은 무의미합니다.