2009-06-23 4 views

답변

4

나는 각 클래스가 자신의 속성을 관리한다고 말합니다. 따라서 하위 클래스는 속성을 해제하고 기본 클래스는 자신을 릴리스해야합니다.

일단 하위 클래스가 해제되면 기본 클래스 속성에 액세스하지 않으며 기술적으로 더 이상 존재하지 않습니다. 쓰기의 dealloc의 표준 방법은 다음과 같습니다 속성에만 서브 클래스에서 사용하는 경우,이 서브 클래스 (안 부모 클래스)에 정의해야하며, 서브 클래스를 해제해야

- (void)dealloc 
{ 
    // release my stuff, after this line 
    // I don't exist and do not need to access any of my properties 
    [super dealloc]; 
} 
+0

동의. 이것은 언어에 관계없이 항상 OO 프로그래밍의 제 규칙입니다. 속성은 Objective-C 메모리 관리와 같은 소유권 기반입니다. 속성은 본질적으로 인스턴스 변수에 액세스하는 좋은 방법이기 때문에 둘은 거의 항상 동일합니다. ivars를 선언 한 클래스에서 항상 릴리스하고, 하위 클래스가있는 경우에는 절대로 ivars를 릴리스하지 않습니다. 기본적으로 유지 및 릴리스 호출을 일치시키는 패턴과 같습니다. –

0

저는 Objective-C를 처음 접했을 때 가장 좋은 대답이 무엇인지 궁금합니다. 속성이 합성되는 부모 클래스 -dealloc에 속성을 nil으로 설정해야한다고 생각합니다. 어떤 이유로 하위 클래스에 유지하는 경우 하위 클래스에서도 해제해야하지만 수퍼 클래스에서 속성을 nil으로 설정하면 부작용이 없어야합니다.

+0

Apple 문서에서는 init/dealloc에서 속성 설정자를 사용하지 않아야하므로 속성을 nil로 설정하지 말고 [ivar release]를 호출하면 안됩니다. ivar을 nil로 설정해야 할 경우 수정해야 할 부분이 잘못되어 있습니다 (예 : 타이머/관찰/제거 된 메소드 호출 제거). –

+0

잘 고맙습니다. 감사합니다. – pix0r

2

그건 내 - (무효)의 dealloc 기능. 당신은 다음과 같은 것을 가질 것입니다 :

- (void)dealloc 
{ 
    [username release]; 
    [password release]; 
    [super dealloc]; 
} 

속성에 dealloc을 호출하지 않습니다. 우리는 더 이상 사용하지 않을 것임을 의미하는 "릴리스"라고 부르며 시스템은이를 정리할 수 있습니다.

0

주어진 블록에서 retain, copy, alloc의 호출 수는 release, autorelease 호출에 의해 균형을 이루어야합니다. 하위 클래스에 무엇인가 보유하고있는 경우 하위 클래스에서 해제하고 기본 클래스에있는 경우 ...

저는 기사의 메모리에서 단계별로 바꾸고 있습니다.

+0

메모리 관리 규칙을 바꿔 말하십시오. 직접 그들을 참조하십시오 : . 규칙은 단지 십여 문장이며, 바꿔 말할 필요가 없습니다. –

0

짧은 대답 : 기본 클래스입니다.

긴 답변 : 개체는 다른 개체에 의해 "소유"됩니다. 개체를 소유하려면 개체를 할당하거나 유지해야합니다 (유지, 할당, 신규 또는 복사). 소유자는 릴리스 또는 자동 릴리스로 메모리를 처분 할 책임이 있습니다. 모든 할당/보유에 대해 하나의 릴리스/자동 릴리스가 있어야합니다.

"new"및 "copy"로 시작하는 메서드 만이 할당되었거나 복사되고 유지되었지만 메서드의 수신기가 소유하지 않은 개체를 반환하는 코코아 규칙입니다. 소유자는 "새로운"또는 "복사"기능을 호출 한 객체입니다.

관련 문제