"Assign"속성으로 정의 된 변수가있는 경우 dealloc 메소드에서 nil로 설정하면됩니까?"Assign"속성을 가진 객체를 nil로 설정
@property (nonatomic, assign) id test;
- (void)dealloc {
self.test = nil;
}
"Assign"속성으로 정의 된 변수가있는 경우 dealloc 메소드에서 nil로 설정하면됩니까?"Assign"속성을 가진 객체를 nil로 설정
@property (nonatomic, assign) id test;
- (void)dealloc {
self.test = nil;
}
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
!
은 따라 달라집니다 당신이 속성 setter을 통해 그것을 할 경우 당신은 그것을 (권장하지 않음) 방법 다음 예.
직접 할당을 수행하는 경우 보존 된 개체가 누출되므로 은 아니요입니다.
그래서이 괜찮 :
- (void) dealloc {
self.test = nil;
[super dealloc];
}
하지만이을 더-가는 없습니다 :
- (void) dealloc {
test = nil;
[super dealloc];
}
내 조언은 단지에 유지 인스턴스 변수 모두에 release
메시지를 보내는 것입니다 -dealloc
이면 test
이 nil
일 경우 아무 일도 발생하지 않으므로 잘 작동합니다.
나를 신뢰하십시오. -dealloc
에 release
을 직접 보내십시오. 그게 전부입니다.
- (void) dealloc {
[test release];
[super dealloc];
}
할당시 문제가 있습니까? – Abhinav
setter를 호출하지 않으므로 객체를 놓기보다는 누출시킵니다. –
또한 'dealloc' 안에 속성을 사용하지 말아야한다는 사실도 있습니다 ... –
+1 정확합니다. 'dealloc'에서 직접 ivar을'release '하는 것이 항상 더 좋습니다. –
"할당"을 사용하는 대신 "보유"를 사용하지 않으면 어떻게됩니까? dealloc에서 "nil"으로 설정해야합니까? – Abhinav
만약'assign'을 사용한다면, 상관 없습니다. 'retain'이나'copy'를 쓰고 있다면 제대로 풀어 주어야합니다. –