2011-08-17 1 views

답변

16

절대 dealloc 메시지를 직접 보내지 마십시오. 대신 객체의 dealloc 메소드는 릴리스 NSObject 프로토콜 메소드를 통해 간접적으로 호출됩니다 (릴리스 메시지로 인해 수신자의 보유 계수가 0이되는 경우). 이러한 메소드의 사용에 대한 자세한 내용은 메모리 관리 프로그래밍 가이드를 참조하십시오.

하위 클래스는 deallocated 객체가 소유 한 데이터 또는 객체 인스턴스 변수에 대해 동적으로 할당 된 저장소와 같이 객체에서 사용하는 추가 메모리를 릴리스 할 수 있도록 자체 버전의 dealloc을 구현해야합니다. 클래스 별 할당 해제를 수행 한 후 서브 클래스 메소드는 super에 대한 메시지를 통해 dealloc의 수퍼 클래스 버전을 통합해야합니다.

중요 : 응용 프로그램이 종료되면 프로세스의 메모리가 dealloc 메시지로 전송되지 않을 수 있습니다 종료시 자동으로 지워짐 - 운영 체제가 모든 메모리를 호출하는 것보다 리소스를 정리할 수있게하는 것이 더 효율적입니다. 관리 방법. 이것과 다른 이유로 memory management의 결과라고 의 dealloc

- (void)release 
{ 
    _retainCount--; 
    if (_retainCount == 0) { 
     [self dealloc]; 
    } 
    } 
1

오브젝트가 더 이상 필요하지 않을 때 (런타임이 결정할 때) 런타임이이를 수행합니다. 그냥 유지하고 제대로 풀어주세요. 다른 객체에서 dealloc을 호출하지 마십시오.

2

dealloc에 부족한 자원을 관리해서는 안된다. 객체 "retainCount"가 0에 도달하면 dealloc 메시지가 자동으로 해당 객체로 전송됩니다.

오버라이드 된 dealloc의 끝에 [super dealloc];을 호출하지 않는 한 객체에 대해 dealloc을 호출하면 안됩니다. -[NSObject dealloc] discussion

에 따라

-(void)dealloc 
{ 
    [ivar release]; //Release any retained variables before super dealloc 

    [super dealloc]; //Only place in your code you should ever call dealloc 
} 

그리고

당신은 직접 할당 해제 메시지를 전송하지 않습니다. 대신 객체의 dealloc 메소드가 릴리스 NSObject 프로토콜 메소드를 통해 간접적으로 호출됩니다 (릴리스 메시지의 결과로 수신자의 보유 계수가 0이되는 경우). 이러한 방법의 사용에 대한 자세한 내용은 에 대한 Memory Management Programming Guide을 참조하십시오.

5

-release이 같은 NSObject의에서 구현되는 것을 상상해

- (void)release 
{ 
    _retainCount--; 
    if (_retainCount == 0) { 
     [self dealloc] 
    } 
} 

내가 조금 더 복잡한보다 확신하지만, 질문에 대한 대답은 개체 자체가 -dealloc 때를 호출하는 것입니다 보유 수는 0으로 떨어진다. 그러나 사용자 정의 클래스는 NSObject에서이 동작을 상속받습니다. 직접 작성한 코드에서 -dealloc을 호출 할 필요가 없습니다. 물체가 적절하게 해제되면 항상 자동으로 실행됩니다.

+0

이 메서드 본문이 '유지'가 아닌 '유지'가되어야합니다. – Saran

+0

@ Saran, 당신이 옳습니다. 내 어리석은 실수. 그것을 잡아 주셔서 감사합니다. – Caleb

+1

정말 좋은 answer.i 위의 답변을 제공하지만 귀하의 대답은 실용적인 방식으로 최선이라고 생각합니다 .. – PJR