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

Jim*_*mmy 9 null properties objective-c objective-c-runtime dealloc

我知道声明属性生成存取方法,这只是语法糖.

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

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

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

为什么不呢?

2)在Apple的Objective-C 2.0,p74中

声明的属性从根本上取代了访问器方法声明; 在合成属性时,编译器仅创建任何缺少的访问器方法.没有与dealloc 方法直接交互  - 不会自动为您释放属性.但是,声明的属性提供了一种交叉检查dealloc 方法实现的有用  方法:您可以在头文件中查找所有属性声明,并确保未标记的对象属性assign 被释放,并且标记的  对象属性不会  assign 被释放.

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

- (void)dealloc { [property release]; [super dealloc]; }
Run Code Online (Sandbox Code Playgroud)

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

- (void)dealloc { [self setProperty:nil]; [super dealloc]; }
Run Code Online (Sandbox Code Playgroud)

这个音符是什么意思?

我找到了[property release];并且[self setProperty:nil];都工作了.

wal*_*lky 9

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

请注意,这种问题只会在某些情况下出现,所以通常很有可能使用self.property=nilin 编写代码dealloc并使所有内容都能正常工作.这不是最好的做法.

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

  • 曾经有一个错误,合成的ivar直接无法使用.但那是一个编译器错误,现在已经修复了很长一段时间. (4认同)
  • 两件事,合成存储仍然可以通过属性的名称访问.@synthesize将在那里提供ivar.第二,如果你在解除分配时还有对象试图观察你,那么工作中存在更大的问题. (2认同)