2009-11-16 3 views
0

다음은 다른 질문에서 온 것입니다. 제 질문은 main()의 retain/release 사용에 관한 것입니다. 이 간단한 예제에서 내 이해에서 retain/release 문은 필요하지 않습니다. 그러나 더 복잡한 상황에서는 행성 인스턴스가 예기치 않게 해제되지 않도록 추가하는 것이 가장 좋습니다. 오브젝트 인스턴스 메모리 관리

EDIT_001

+(Planet *) planet { 
    gPlanetCount++; 
    //return [[[Planet alloc] init] autorelease]; 
    return [[[self alloc] init] autorelease];  // Better 
} 

int main(int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Planet *outerMost; 

    outerMost = [[Planet planet] retain]; 
    ... 
    ... some code 
    ... 
    [outerMost release]; 
    [pool drain]; 
    return 0; 
} 

그래서 나는 더 나은로 위를 작성할 수 있습니다.

int main(int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Planet *outerMost; 

    outerMost = [Planet planet]; 
    ... 
    ... some code 
    ... 
    [pool drain]; 
    return 0; 
} 

환호 게리

+1

메모리 관리 코드가 정확하지만 다음을 추가 할 수 있습니다. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 을 주 기능의 첫 번째 줄로 사용하십시오. 마지막에 풀을 배출 할 때 코드 조각에이 태그를 두는 것을 잊어 버렸을 것입니다. –

+0

Markus, 바로 지금 바로 그 코드를 추가 할 것입니다. 코드에 넣었습니다. 여기에 코드를 추가하는 것을 잊어 버렸습니다. 지적 해 주셔서 감사합니다. – fuzzygoat

+0

클래스 수준 메소드에서 [self alloc]을 사용하는 것을 본 적이 없습니다. 이게 효과가 있니? 나는 "자기"가 클래스의 인스턴스를 위해 예약되었다고 생각했다. – rein

답변

3

마르쿠스 뮐러의 코멘트는 코드가 누락 된 풀 할당 및 초기화를 제외하고, 정확, 즉, 올바른 것입니다.

그러나 루틴/메소드에서 자동 반복 처리 된 오브젝트를 작성하고 해당 루틴/메소드에서 해당 오브젝트를 사용하고이 루틴/메소드를 종료하기 전에 완료 한 경우 그 루틴/메소드를 종료 할 이유가 없습니다 그것을 보관하고 놓으십시오. 이 객체는 루틴/메소드의 수명 기간 동안 유지되도록 보장되며,이 경우 [풀 드레인] 메소드로 해제 될 가능성이 큽니다.

예기치 않게 outerMost가 해제되는 상황이 발생하지 않습니다. 예상 릴리스는 [수영장 드레인]에 있습니다. main() 내에서 얼마나 많은 다른 메서드가 호출되는지는 중요하지 않습니다. 유지/해제 지침을 따르는 한 outerMost는 유지할 필요가 없습니다.

+0

아아아, EDIT_001을 (를) 작성하는 더 좋은 방법이라고 생각하십니까? – fuzzygoat

+0

fuzzygoat : 예, 불필요하게 객체를 유지하고 해제하지 않기 때문입니다. 다른 autorelease 풀에서 극도로 펑키 한 일을하지 않는 한 autorelease는 'main'에서 만든 풀을 배수 할 때까지 오지 않을 것입니다. –

+0

피터 감사합니다. – fuzzygoat