2012-10-30 3 views
0

애플리케이션에서 몇 개의 자동 릴리스를 생성 할 수 있습니까? 제한이 있습니까?ios에서 자동 해제 풀 사용시 제한 사항

Google에서 답변을 검색했지만 유용한 정보가 없습니다.

그리고 구글에서

int main(){ 

NSAutoreleasepool *pool = [NSAutoreleasepool alloc]init]; 

NSString *str = [NSString alloc]init]; 

[pool drain]; 
} 

, 난 거의 모든 기사에서이 샘플을 발견했다. 위의 코드를 사용하면 Xcode에서 분석을하면 메모리 누수가 발생합니다. 대신 str을 이런 식으로 할당하면 NSString * str = [NSString alloc] init] autorelease;

메모리 누수가 발생하지 않습니다.

어느 쪽이 옳은가요?

또한 위의 코드에서 나는 [pool drain] 문을 실행하면 변수 str이 해제된다는 것을 발견했습니다. NSAutoreleasePool 대신 "@autorelease"키워드를 사용하여 동일한 코드를 작성하면 어떻게됩니까? 우리가 @autorelease를 사용한다면 [pool drain]과 같은 어떤 언급도 없을 것입니다.

나는

int main(){ 

@autorelease{ 
NSString *str = [NSString alloc]init]; 
} 
} 

감사 Jithen

+1

u는 원하는만큼 사용할 수 있지만 어디서 어떻게 사용하는지 알고 싶습니다. –

답변

3

NSAutoreleasePool 또는 @autorelease의 사용은 메모리 누수를 고정하지 않습니다 이런 식으로 의미한다. 자동 사용 해제 된 오브젝트가 릴리스되는 범위를 제어하는 ​​데 사용됩니다. autorelease 풀을 사용하는지 여부에 관계없이 적절한 메모리 관리가 필요합니다.

게시 한 첫 번째 코드 블록에서 문자열을 할당하기 때문에 메모리 누수가 발생하지만 개체에는 release을 절대 호출하지 않습니다. 이 경우 str은 자동 다시 출시 개체가 아닙니다. autorelease 풀은이 객체에 영향을 미치지 않습니다.

문자열에 autorelease에 대한 호출을 추가하면 개체가 대기열에 추가되어 어느 시점에서 자동 릴리스됩니다. autorelease 풀을 배수하면 해당 릴리스가 트리거됩니다.

@autorlease을 사용하는 마지막 코드는 첫 번째 코드 블록과 동일합니다. str이 제대로 누출되지 않아 누출됩니다. 그러나 이것은 autorelease 풀과는 아무런 관련이 없습니다.

ARC를 사용하면 게시 한 첫 번째 및 마지막 코드 블록에 대한 문제가 해결됩니다. ARC가 str을 공개합니다.

편집 : 위의 설명에서 설명한 것처럼 자동 릴리스 된 오브젝트가 실제로 해제 될 때 제어해야하는만큼 많은 자동 릴리스 풀을 가질 수 있습니다.