我从本主题复制了此示例。 It's better to release the ivar directly.
最好直接释放ivar。如果子类覆盖
属性的设置方法,您的对象可能会泄漏,因为
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版本]与self.anObject = nil之间有任何区别。
因为
self.anObject = nil
等于
[anObject release];
anObject=nil;
为什么我的[anObject版本]没有内存泄漏?
最佳答案
因为
self.anObject = nil
等于
[anObject release];
anObject=nil;
这是不正确的,并且是造成混淆的原因。self.anObject = nil
不会转换为直接ivar访问。相反,它变成了
[self setAnObject:nil];
而且,由于您重写了
-setAnObject:
方法不执行任何操作,因此底层实例变量永远不会被释放,从而导致内存泄漏。顺便说一句,这就是为什么您应该避免在
init
和dealloc
方法中使用setter方法的原因。子类可以重写它们来做非常规的事情。关于ios - 为什么我的self.anObject = nil有问题,但[anObject版本]没有内存泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8287008/