为什么我没有[anObject release]的内存泄漏,而我有self.anObject = nil的问题?

时间:2011-11-27 16:23:35

标签: ios memory-leaks

我从这个主题复制了这个例子。 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]没有内存泄漏?

2 个答案:

答案 0 :(得分:4)

  

由于

     

self.anObject = nil

     

等于

     

[anObject release];

     

anObject=nil;

这是不正确的,是您混淆的根源。

self.anObject = nil NOT 转换为直接的ivar访问权限。它变成了

[self setAnObject:nil];

由于你已经覆盖了-setAnObject:方法什么都不做,底层的实例变量永远不会被释放,因此你就会泄漏内存。

顺便提一下,这是完全为什么你应该避免在initdealloc方法中使用setter方法。子类可以覆盖它们来做非传统的事情。

答案 1 :(得分:1)

如果你在谈论B类的一个对象,那么你的二传手根本不会做任何事情。所以它不会释放anObject,所以你有泄漏。