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

Ios 为什么我不';[anObject release]没有内存泄漏,而self.anObject=nil有问题?,ios,memory-leaks,Ios,Memory Leaks,我从这个主题中复制了这个例子 最好直接释放ivar。如果子类重写 属性的setter方法时,对象可能会泄漏,因为 不调用setter 我看不出[anObject release]和self.anObject=nil之间有什么区别。 因为 self.anObject = nil 等于 [anObject release]; anObject=nil; 为什么[anObject release]没有内存泄漏?如果您谈论的是类B的对象,那么setter根本不做任何事情。所以它不会释放一个对象,所以

我从这个主题中复制了这个例子

最好直接释放ivar。如果子类重写 属性的setter方法时,对象可能会泄漏,因为 不调用setter

我看不出[anObject release]和self.anObject=nil之间有什么区别。 因为

self.anObject = nil
等于

[anObject release];
anObject=nil;

为什么[anObject release]没有内存泄漏?

如果您谈论的是类B的对象,那么setter根本不做任何事情。所以它不会释放一个对象,所以你有一个漏洞。

如果你说的是B类的对象,那么你的setter根本不做任何事情。所以它不会释放一个对象,所以你有一个漏洞

因为

self.anObject=nil

等于

[anObject release]

anObject=nil

这是不正确的,也是你困惑的根源

self.anObject=nil
不会转换为直接ivar访问。反而变成了

[self setAnObject:nil];
由于您已经重写了
-setAnObject:
方法而不执行任何操作,因此底层实例变量永远不会被释放,从而导致内存泄漏

顺便说一句,这正是您应该避免在
init
dealoc
方法中使用setter方法的原因。子类可以覆盖它们来做非常规的事情

因为

self.anObject=nil

等于

[anObject release]

anObject=nil

这是不正确的,也是你困惑的根源

self.anObject=nil
不会转换为直接ivar访问。反而变成了

[self setAnObject:nil];
由于您已经重写了
-setAnObject:
方法而不执行任何操作,因此底层实例变量永远不会被释放,从而导致内存泄漏


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

断章取义,您的最后几行代码是正确的-但是上面的示例清楚地构造了一个案例,其中
self.anObject=nil不释放任何内容。然而,我认为构建的案例非常糟糕。尽管出于防御性和健壮性的编码原因,原始作者是正确的,只是不使用setter进行发布。断章取义,您的最后一行代码是正确的-但是上面的示例清楚地构造了一个案例,其中
self.anObject=nil不释放任何内容。然而,我认为构建的案例非常糟糕。不过,出于防御和健壮的编码原因,最初的作者是正确的,只是不使用setter来发布。