2010-07-08 5 views
1

내 질문은 개체가 실제로 autorelease 풀에 추가됩니다 때입니까? Autorelease 풀이 만들어지고 범위 내에서 개체가 선언되면 autorelease 풀에 개체가 추가되거나 autoreleased로 지정되면 풀에 추가됩니다.Autorelease 풀의 개체가 Objective-C에서 어떻게 처리됩니까?

int main(void) { 
    NSAutoreleasePool *pool; 
    pool = [[NSAutoreleasePool alloc] init]; 
    NSString *string; 
    NSArray * array; 
    string = [[[NSString alloc] init] autorelease]; 
    array = [[NSArray alloc] init]; 
    /* use the string */ 
    [pool drain]; 
} 

이 경우 문자열 만 풀에 추가되거나 배열이 풀에 추가됩니까?

답변

0

-autorelease이 호출 될 때 객체가 자동 풀 풀에 추가됩니다 (예, 풀, 스레드 당 스택이 있음). 그러나 'new', 'alloc'또는 'copy'라는 단어가 포함되지 않은 메서드에서는 (하나 또는 둘을 잊어 버렸을 수도 있음) 반환 된 값은 일반적으로 자동 반환되어 반환됩니다 . 전체적으로 memory management guide을 읽어야합니다 (이 아님).

+0

답장을 보내 주셔서 감사합니다. 또한 중첩 된 풀을 만들 때 개체가 부모 풀에서 만들어지는 autorelease와 같이 중첩 된 풀에서 개체를 사용할 수 있는지 또 다른 의문의 여지가 있습니다. – Cathy

+0

@Cathy : 가능 합니다만, 이것은 메모리 관리를 혼란스럽게 할 것입니다. 문서가 말했듯이, 여러분이 생성하거나 보존하지 않은 것을 공개하지 마십시오. 기본적으로 나는 이것을 깔끔하게 처리 할 수있는 상황을 생각할 수 없다. 기술적으로는 괜찮지 만, 너무 많이 공개하지 않는 한 (두 번 자동 갱신) –

0

개체는 autorelease 메서드가 전송 될 때 에만 추가됩니다.

자동 복구 풀은 스택으로 저장되며 개체는 autorelease가 전송 될 때 스택의 최상위 풀 (가장 최근에 생성됨)에만 추가됩니다.

그러나 자동 복구 풀 자체는 효과적으로 스택의 다음 풀에 있습니다. 따라서 가장 오래된 풀을 배수하면 그 이후 생성 된 모든 풀도 배수됩니다. 이것은 예외를 throw하는 컨텍스트에서 중요합니다. 풀이나 풀 속의 객체를 유출하지 않고 자동 풀 풀이있는 스택 프레임을 통해 예외를 던질 수 있습니다.

관련 문제