我从这个主题复制了这个例子。 It's better to release the ivar directly.
最好直接释放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
我认为[anObject release]和self.anObject = nil之间没有任何区别。 因为
self.anObject = nil
等于
[anObject release];
anObject=nil;
为什么我的[anObject release]没有内存泄漏?
答案 0 :(得分:4)
由于
self.anObject = nil
等于
[anObject release];
anObject=nil;
这是不正确的,是您混淆的根源。
self.anObject = nil
将 NOT 转换为直接的ivar访问权限。它变成了
[self setAnObject:nil];
由于你已经覆盖了-setAnObject:
方法什么都不做,底层的实例变量永远不会被释放,因此你就会泄漏内存。
顺便提一下,这是完全为什么你应该避免在init
和dealloc
方法中使用setter方法。子类可以覆盖它们来做非传统的事情。
答案 1 :(得分:1)
如果你在谈论B类的一个对象,那么你的二传手根本不会做任何事情。所以它不会释放anObject,所以你有泄漏。