9

我知道声明的属性会生成访问器方法,这在某种程度上只是语法糖。

我发现很多人self.property = nil在他们的dealloc方法中使用。

1)在苹果的内存管理文档中,p23 说:

唯一不应该使用访问器方法来设置实例变量的地方是 init 方法和 dealloc。

为什么不应该?

2) 在苹果的Objective-C 2.0中,p74

声明的属性从根本上代替了访问器方法的声明;当你合成一个属性时,编译器只创建任何不存在的访问器方法。与该 dealloc 方法没有直接交互——属性不会自动为您释放。然而,声明的属性确实提供了一种交叉检查方法实现的有用 dealloc 方法:您可以在头文件中查找所有属性声明,并确保释放未标记 assign 的对象属性,并且 assign 未释放标记的对象属性。

注意:通常在dealloc方法中,您应该release直接对象实例变量(而不是调用 set 访问器并nil作为参数传递),如下例所示:

- (void)dealloc { [property release]; [super dealloc]; }

但是,如果您正在使用现代运行时并合成实例变量,则无法直接访问实例变量,因此您必须调用访问器方法:

- (void)dealloc { [self setProperty:nil]; [super dealloc]; }

注释是什么意思?

我发现[property release];并且[self setProperty:nil];两者都有效。

4

1 回答 1

9

设置一个属性可能会导致通知被发送到正在观察该属性的其他对象。这可能反过来导致那些对象试图对你的对象做进一步的事情。如果您正在解除分配,这可能不是您想要发生的。所以一般来说release直接关联实例变量比较安全。

请注意,此类问题只会在某些情况下出现,因此通常完全有可能使用self.property=nilin编写代码dealloc并且一切正常。这不是最佳实践。

在 Objective-C “现代运行时”中,可以在不指定 ivar 的情况下声明属性。运行时将合成存储以与合成的访问器一起使用。在这种情况下,您不能直接释放 ivar,因为就您的代码而言,没有一个。所以你别无选择,只能走这self.property=nil条路。

于 2011-04-11T12:45:55.187 回答