gpt4 book ai didi

ios - 为什么我在 [anObject release] 时没有内存泄漏,而我在 self.anObject = nil 时遇到问题?

转载 作者:行者123 更新时间:2023-11-28 18:43:30 27 4
gpt4 key购买 nike

我从这个主题中复制了这个例子。 It's better to release the ivar directly.

It's better to release the ivar directly. If a subclass overrides the setter methods of a property, your object might leak because your setter is not called.

@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] 没有内存泄漏?

最佳答案

Because

self.anObject = nil

is equal to

[anObject release];

anObject=nil;

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

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

[self setAnObject:nil];

并且由于您重写了 -setAnObject: 方法不执行任何操作,因此永远不会释放底层实例变量,因此您正在泄漏内存。

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com