我从本主题复制了此示例。 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:方法不执行任何操作,因此底层实例变量永远不会被释放,从而导致内存泄漏。

顺便说一句,这就是为什么您应该避免在initdealloc方法中使用setter方法的原因。子类可以重写它们来做非常规的事情。

关于ios - 为什么我的self.anObject = nil有问题,但[anObject版本]没有内存泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8287008/

10-11 17:07