2011-01-19 3 views

답변

4

ivar을 직접 출시하는 것이 좋습니다. 하위 클래스가 속성의 setter 메서드를 재정의하는 경우 setter가 호출되지 않기 때문에 개체가 누출 될 수 있습니다. 고려 :

@interface ClassA 
@property (readwrite, retain) id anObject; 
@end 

@interface ClassB : ClassA 
@end 

@implementation ClassA 
@synthesize anObject; 

- (void)dealloc { 
    self.anObject = nil; 

    [super dealloc]; 
} 
@end 

@implementation ClassB 
- (void)setAnObject: (id)anObject { 
    // do nothing! 
} 
@end 

인스턴스의 클래스 B 유출됩니다 anObject!

+1

+1 정확합니다. 'dealloc'에서 직접 ivar을'release '하는 것이 항상 더 좋습니다. –

+0

"할당"을 사용하는 대신 "보유"를 사용하지 않으면 어떻게됩니까? dealloc에서 "nil"으로 설정해야합니까? – Abhinav

+2

만약'assign'을 사용한다면, 상관 없습니다. 'retain'이나'copy'를 쓰고 있다면 제대로 풀어 주어야합니다. –

1

은 따라 달라집니다 당신이 속성 setter을 통해 그것을 할 경우 당신은 그것을 (권장하지 않음) 방법 다음 예.

직접 할당을 수행하는 경우 보존 된 개체가 누출되므로 은 아니요입니다.

그래서이 괜찮 :

- (void) dealloc { 
    self.test = nil; 
    [super dealloc]; 
} 

하지만이을 더-가는 없습니다 :

- (void) dealloc { 
    test = nil; 
    [super dealloc]; 
} 

내 조언은 단지에 유지 인스턴스 변수 모두에 release 메시지를 보내는 것입니다 -dealloc이면 testnil 일 경우 아무 일도 발생하지 않으므로 잘 작동합니다.

나를 신뢰하십시오. -deallocrelease을 직접 보내십시오. 그게 전부입니다.

- (void) dealloc { 
    [test release]; 
    [super dealloc]; 
} 
+0

할당시 문제가 있습니까? – Abhinav

+2

setter를 호출하지 않으므로 객체를 놓기보다는 누출시킵니다. –

+0

또한 'dealloc' 안에 속성을 사용하지 말아야한다는 사실도 있습니다 ... –

관련 문제