2010-06-10 2 views
0

나는 아직도 (가비지 콜렉터는 자바에서 모든 것을 처리했다)이 메모리 관리 물건에 새로운 오전,하지만 지금까지 당신이 개체에 대한 메모리를 할당하면 내가 을 이해 당신은에 다시을 그 메모리를 해제해야 당신이 당신의 목표로 끝내 자마자 컴퓨터. @ 인터페이스, @implementation 및 주요:Objective-C 메모리 관리 : 언제 내가 [해제]합니까?

myObject = [Object alloc]; 

[myObject release]; 

는 지금은 그냥 내 오브젝티브 -C하는 .m 파일 3 개 부분이있다. 나는 다음이 사람들에게 프로그램의 끝에서 내 객체를 발표 :

[pool drain]; 
return 0; 

그러나이 프로그램은 프로그램의 마지막에 인 myObject을 출시 괜찮을 것, 훨씬 더 복잡 할 것 인 경우 ?

더 나은 질문은 언제 객체의 할당 된 메모리를 해제합니까? [myObject release];의 위치를 ​​어떻게 알 수 있습니까?

답변

3

이것은 약간 지나치게 단순화되었지만 일반적으로 선언 한 곳에서 릴리스하려고합니다.

특정 메서드 호출 내부에 개체를 선언하면 해당 메서드 호출이 끝날 때 정의에 따라 해당 개체 (또는 적어도 해당 개체의 핸들)를 수행하게됩니다. 그런 다음 놓습니다.

개체를 인스턴스 변수로 선언하면 해당 인스턴스가 소멸 될 때 정의에 따라 완료됩니다. 해당 클래스의 dealloc 메서드에서 해제하십시오.

"릴리스"는 "파괴"와 같지 않습니다. 응용 프로그램에서 객체를 전달할 때 다른 객체에 저장된 객체에 대한 핸들을 두 개 이상 갖는 것이 합리적 일 수 있습니다.이 경우 "release"는 "이 객체로 완료되었지만 다른 객체가있을 수 있습니다. 그것을 사용하십시오. " 할당 취소는 "핸들"(보유 수)의 수가 0에 도달 할 때만 발생합니다.

애플은 메모리 관리에 대해 환상적인 문서를 가지고 있는데, 나는 이것을 developer.apple.com에서 확인한다.

1

기본적으로 서로 다른 패턴을 가진 3 가지 종류의 개체가 있습니다.

과도은해야 autorelease 과도 객체, 일반적으로

개체. 로컬로 할당되고 호출되는 메서드를 벗어나 존재할 필요가없는 개체입니다. 또는 메소드에서 메소드로 전달됩니다. 하나의 객체가 다른 객체의 내부 인스턴스 필드로 존재하는 경우, 당신은 '소유 "(또는"아이 ") 객체를 release한다

소유권의

체인 때"소유자 "(또는"부모 ") 개체 존재하지 않는다.이것은 부모 개체의 dealloc 방법으로 이루어집니다 : 프로그램 개체가 프로그램의 수명을 위해 존재하는 것입니다

- (void) dealloc { 
    [child release]; // child was declared as an instance variable 
    [super dealloc]; 
} 

수명, 그것은 일반적으로 필요하지 않습니다 어떤 종류의 자원 정리가 발생할 필요가 없다면 release으로 전화하십시오. 이것을 Apple 문서에서 찾아 볼 수있는 applicationWillTerminate:에 넣을 수 있습니다.

(당신은 아마 같은 객체를 피하기해야하지만 다른 질문에 대한 토론입니다.)

+2

:'대부분의 아이폰 OS 4에서 호출되지 않습니다 시간. – ohho

+0

전화하세요. 그것은 어쨌든 내가 일반적으로 필요로하는 방법이 아닙니다. –

1

당신은 소유권의 관점에서 생각해야합니다. 당신이 ALLOC, 새로운 또는 유지를 호출하여 개체의 소유권을 가질 때, 또한 그것을 해제하기위한 책임 중 하나는, 또는 를 호출하여 호출자에게 소유 된 개체를 반환 할 때 오토 릴리즈를 호출하여 출시.

일반적인 규칙은 다음

로컬 변수 : 동일한 방법 내에서 해제. 당신이 호출자에게 반환 할 때, 가 autorelease를 사용

클래스 멤버 다음 의 dealloc에 ​​놓습니다 방법

applicationWillTerminate가`주목하시기 바랍니다