2013-04-23 2 views
0

Autorelease Pool Blocks을 발견했을 때 나는 최근에 Advanced Memory Management 문서를 읽고있었습니다. 설명서 내용 :Autorelease Pool Blocks

루프 내에서 자동 해제 풀 블록을 사용하여 다음 반복 전에 해당 개체를 처리 할 수 ​​있습니다. 루프에서 autorelease 풀 블록을 사용하면 애플리케이션의 최대 메모리 사용 공간을 줄일 수 있습니다. [...] autorelease 풀 블록 내부에 autorelease 메시지를 보낸 개체는 블록 끝에서 해제됩니다.

블록 내부에서 자동 복구 호출을하지 않는 개체는 어떻게됩니까? 나는 또한 그들이 0으로 자신의 보유 개수를 감소 가정합니다. 그럼, 내 질문은, 어느 시점에서 autorelease를 호출하는 시점은 무엇입니까, 블록 안에 만들어진 객체는 블록의 끝에 릴리스 호출을 얻을 것입니다?

답변

2

개체는 -release 또는 -autorelease 메시지를 보내어 해제 할 수 있습니다.

-release으로 참조 카운트가 즉시 감소되어 할당 해제로 이어질 수 있습니다.

-autorelease으로 감소는 개체가 생성 된 범위를 벗어나지 않도록 유지됩니다. 예를 들어 도우미 메서드 -createFoo은 자동 렌더링 된 개체를 반환 할 수 있으므로 호출자는 메서드에서 반환 될 때 즉각 해제되지 않고 반환 할 개체를 사용할 수 있으며 누가 공개해야 하는지를 염려 할 필요가 없습니다.

ARC를 사용하면 컴파일러에서 이러한 모든 세부 정보를 처리합니다. autorelease을 사용하면 개체가 조금 오래 살아있을 수도 있다는 것을 알아야합니다.

- (void)foobar 
{ 
    for (/* a long time */) { 
     NSMutableString *s = [NSMutableString string]; 
     // ... 
    } 
} 

NSMutableString+string 방법은 오토 릴리즈 객체를 반환합니다

이 '유지 살아'문제는 다음과 같은 루프에 대한 의미를 가지고있다. 이것은 이 아니며은 루프 반복 또는 메소드의 끝에서 자동으로 할당이 해제되지 않습니다. (ARC는 호출 스택을 조사하여 영리한 최적화를 수행 할 수 있지만이를 무시합니다). 즉, 루프 본문 내에있을 때 무한대의 메모리가 증가하게됩니다.

NSMutableString *s = [[NSMutableString alloc] init]; 

다음 ARC는 루프 본문의 끝에 release 전화를 삽입합니다 및 문자열을 즉시 해제 할 것입니다 : 우리는 다음과 같은 사용했다면 것을

참고. 루프의 각 반복 한 후, 오토 릴리즈 풀은 파괴되고, 모든 객체는 오토 릴리즈 된 것을, 지금

- (void)foobar 
{ 
    for (/* a long time */) { 
     @autoreleasepool { 
      NSMutableString *s = [NSMutableString string]; 
      // ... 
     } 
    } 
} 

: 이

이 첫 번째 예제의 무제한의 메모리 증가를 해결하려면

, 당신은 명시 적 오토 릴리즈 풀을 정의 수영장 안쪽 (우리 끈 포함)은 즉시 석방 될 것입니다.

그래서 모두 호출하는 메소드의 종류와 자동 릴리즈 된 객체를 반환하는지 여부에 따라 다릅니다.

+0

"루프가 반복 될 때마다 자동 해제 풀이 삭제되고 풀 내부에서 자동으로 풀린 개체 (문자열 포함)는 즉시 해제됩니다." 그렇다면 내부적으로 자동 판매가 안되면 어떨까요? 그들의 수명이 블록을 벗어날 수 없기 때문에 어쨌든 autorelease 블록의 끝에서 해제되지 않을까요? 그럼 내 질문은 남아 : 왜 우리는 블록의 끝에 개체가 공개되는 방식 중 하나를 autorelease 전화가 필요합니까? – Teo

+1

자동 복구 풀은 자동 복구 된 개체 만 릴리스합니다. autorelease가없는 객체의 경우, 컴파일러는 적절한 위치에 명시 적 릴리스 호출을 삽입하므로 자동 릴리스 풀이 끝나기 전에 릴리스됩니다. –

+1

만약 당신이 이것을 오해하고있는 경우에 대비하여, 내 게시물의 첫 번째 코드 블록에는 자동 풀이 없습니다. 메서드 또는 루프 내부에서 생성 된 자동 렌더링 된 객체는 메서드가 반환 될 때 해제되지 않습니다. 그들은 나중에 풀릴 것이다. 대부분의 UI 코드에는 런 루프의 반복마다 생성되는 상위 자동 릴리스 풀이 있습니다. 그러나 꽉 짜여진 루프가 있다면 너무 많은 객체를 만들지 않도록 자신 만의 루프를 만들어야합니다. –