Ios 为什么我不';[anObject release]没有内存泄漏,而self.anObject=nil有问题?
我从这个主题中复制了这个例子 最好直接释放ivar。如果子类重写 属性的setter方法时,对象可能会泄漏,因为 不调用setter 我看不出[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根本不做任何事情。所以它不会释放一个对象,所以
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来发布。