2011-01-07 4 views
1

NSAutoReleasePool의 작동 방식을 이해하는 데 어려움이 있습니다.NSAutoreleasePool EXC_BAD_ACCESS 및 Objective-C의 메모리 관리에 대한 질문

1) NSAutoReleasePool 별도로 각 할당을 추적 않거나 변수에 의존 작동합니까? 즉,이 누출 메모리를 수행하거나 해제 모두?

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
NSArray* myObj = [NSObject alloc]; 
myObj = [NSObject alloc]; 
[pool release]; 

2) 이유는 무엇입니까 다음 코드가 작동 :

NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc] init]; 

NSArray* myObj = [NSObject alloc]; 

for(int i = 0; i < 100; i++) { 
    [myObj release]; 
    myObj = [NSObject alloc]; 
} 

[pool1 release]; 

하지만 다음은 [pool1 release]에서 EXC_BAD_ACCESS을 제공합니다

NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc] init]; 

NSArray* myObj = [NSObject alloc]; 

NSAutoreleasePool *pool2 = [[NSAutoreleasePool alloc] init]; 

for(int i = 0; i < 100; i++) { 
    [myObj release]; 
    myObj = [NSObject alloc]; 
} 

[pool2 release]; 
[pool1 release]; 

3) 작업 위의 코드 (2 개의 풀이있는 코드)?

+1

다음 번에 사용하지 말고 을 사용하지 마시고 "'을 사용하거나 패널에서 {} 기호를 클릭하십시오. 이것은 우리가 여기에서하는 방식입니다 : D – vodkhang

+0

알지 못했습니다. 덕분에 – Caner

+2

autorelease 풀이 _autoreleased_ 오브젝트를 릴리스하고 임의의 오브젝트를 릴리즈하지 않아야한다는 것을 깨닫지 못하고 있습니다. 테스트 객체를 초기화하지 않은 상태에서 autoreleased하지 않았으므로 자동 풀이 풀을 만지지 않습니다. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html%23//apple_ref/doc/uid/20000043-BEHDEDDB 및 http://developer.apple을 참조하십시오. .com/library/mac/# documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html % 23 // apple_ref/doc/uid/20000047-CJBFBEDI –

답변

5

자동 복구 풀은 자동 해제하는 객체에서만 작동합니다. 코드의 어떤 객체도 자동으로 릴리즈되지 않으므로 생성 한 풀의 영향을받지 않습니다.

따라서 답은 다음과 같습니다

  1. 그것은
  2. 그것은하지 않습니다 (중 발표하거나 오토 릴리즈되어 둘 때문에) 두 객체 누수. 마지막으로 할당 된 객체가 누설됩니다.
  3. The documentation says that you can nest them. 난 당신이 [NSObject alloc]이 어디에 당신이 정말로 [[[NSObject alloc] init] autorelease]을 의미한다고 가정하면이 myObj을 해제 난생 처음 그것을 pool2 외부에 선언 된 객체에 대한 것이기 때문에 다음 두 번째 코드 샘플은 실패합니다. 즉, releasepool1이 이미 해제 된 개체를 해제하려고 할 때. 그것을 작동시키는 방법은 객체가 유지되거나 할당되는 것보다 더 많은 시간을 릴리즈 (또는 자동 릴리즈)하지 않는 것입니다.
2

NSAutoreleasePool은 할당 전혀 추적하지 않습니다. 메시지에 autorelease을 보내면 스레드에서 자동 복구 풀이 검색됩니다 (하나는 실행 루프를 통해 각 트립의 상단에 자동으로 생성되고 하단에는 할당 해제 됨). 대부분의 경우, 수동으로 생성). 발견되면 자동 풀이 유지하는 오브젝트 목록에 추가됩니다. 오토 릴리즈 풀 할당이 해제되면

, 그것은 그 목록의 각 항목에 release 메시지를 보냅니다. 항목이 목록에 여러 번 추가되면 여러 번 릴리스됩니다.

코드가 EXC_BAD_ACCESS를 얻는 이유는 확실하지 않습니다. 어떤 NSObject에 init을 호출하지 않았거나 아직 알려주지 않은 코드와 관련이있을 수 있습니다.

2

몇 가지 :

: 객체를 생성 할 때 항상 init 메소드를 사용합니다. (즉, [NSObject의의 ALLOC] INIT])

: 그들은 오토 릴리즈되면 개체는 AutoreleasePool 첨가하자. 이 예제의 객체는 단순히 해제되고 있으므로 autorelease 풀을 전혀 사용하지 않습니다.모든 autorelease 풀을 제거하여이를 볼 수 있습니다. 코드는 여전히 잘 작동합니다.

: 첫 번째 예는 메모리를 누설합니다. 두 개의 객체를 할당하고 둘 중 하나를 해제하지 않습니다. 만약 당신이 그들을 자동 포기했다면, 아마도 당신이 찾고있는 행동을 얻었을 것이고 누출은 없을 것입니다.

: 예 2는 객체를 배포하는 것보다 할당하는 것이기 때문에 작동합니다. 그 중 어느 것도 자동 풀 풀을 사용하지 않습니다. autorelease 코드를 제거하면이를 볼 수 있습니다.

: 예제 3에서 보이는 동작을 복제 할 수 없었습니다. 코드 내에 뭔가 다른 것이있을 수 있습니다.

관련 문제