在dealloc中使用self.property = nil有什么问题吗?

时间:2011-04-11 12:18:23

标签: objective-c properties null dealloc objective-c-runtime

我知道声明的属性生成了访问器方法,这种方法只是语法糖。

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

1)在Apple的内存管理文档中,第23页 它说:

  

你不应该使用访问器方法设置实例变量的唯一地方是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];都有效。

1 个答案:

答案 0 :(得分:9)

设置属性可能会导致将通知发送到正在观察该属性的其他对象。这可能反过来导致那些对象试图对您的对象做进一步的事情。如果您正在解除分配,这可能不是您想要发生的事情。因此,通常直接release相关实例变量更安全。

请注意,这种问题只会在某些情况下出现,因此通常可以使用self.property=nil中的dealloc编写代码,并确保一切正常。这不是最好的做法。

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