2011-01-04 2 views
1

누구나 NSAutoreleasePool이이 코드에서 유출되는 이유를 알 수 있습니까? 나는 누출을 확인하기 위해 도구를 사용하고 있습니다. &이 코드는 어떻게 든 새어 나옵니다. 누구든지 나를 올바른 방향으로 안내 할 수 있습니까? 나는 정확히 같은 코드를 다른 곳에서 가지고있다. & 잘 작동한다.NSAutoReleasePool 누설

ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:self.url]; 
[request setDelegate:self]; 

NSOperationQueue *queue = self.downloadQueue; 
[queue addOperation:request]; 
[request release]; 
+1

'[요청 해제]'다음에'[queue release]'를 추가하면 누수가 남아 있습니까? –

답변

2

해당 코드 주위에 NSAutoreleasePool을 만들면 사라져야합니다. 이것은 주로이 코드가 주 스레드에서 실행되지 않는 경우 발생합니다.

NSAutoreleasePool* pool = [NSAutoreleasePool new]; 
// Your code goes here 
[pool drain]; 

또한, 당신은 NSAutoreleasePool 새/드레인 블록 내부 반복하는 경우, 당신은 당신이 드레인을 명중 할 때까지 누출 표시된다는 점에 유의. 이것의 결말은 당신의 앱이 여전히 메모리가 부족한 루프 안에서 너무 많은 메모리를 할당하고있는 경우입니다. 이 경우 루프를 통해 매번 두 번째 NSAutoreleasePool을 생성하고 배수해야 할 수도 있습니다 (또는 오버 헤드를 피하기 위해 루프를 통해 매 n 번째마다).

+0

+1을 참조하십시오. autorelease 풀을 생성하고 스레드가 종료 될 때까지 스레드를 제거하지 않는 스레드 항목에 코드가 자주 표시됩니다. 수명이 긴 스레드 또는 많은 메모리 (예 : 이미지)를 할당하는 짧은 스레드의 경우 풀을 자주 비우고 다시 만들어야합니다. – par

1

이 코드를 보조 스레드에서 실행하고 있습니까? 그렇다면 자동 출시 풀을 입력시 설치 했습니까?

+0

모든 것이 메인 쓰레드에 없다. NSAutorelease 풀 자체를 관리한다고 생각하는 멀티 스레딩을 위해 NSOperationQueue를 사용하고있다. 만약 다른 쓰레드에서 NSThread를 직접 사용했다면, 특정 쓰레드를위한 풀을 풀어 놓아야했다. 권리..? 내가 틀렸다면 나를 바로 잡아라 .. –

+0

이 함수를 통해 NSAutoreleasePool을 감싸고 문제를 해결할 수 있는지 알아볼 수있다. AutoreleasePool 누출은 일반적으로 AutoreleasePool이없는 백그라운드에서 메소드를 수행하려고 할 때 발생합니다. –

+0

예, 조작 메인에 자동 해제 풀을 작성해야합니다. Mark의 코멘트는 http://stackoverflow.com/questions/184409/nsautoreleasepool-in-nsoperation-main – par