目标C语言 是否有任何问题使用自我.在dealloc中属性= nil



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

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

1) Apple的Memory Management文档,p23它说:

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

为什么不能?

苹果的<<p> 2) strong> objective - c 2.0 , p74

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

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

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

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

这个注释是什么意思?

我发现[property release];[self setProperty:nil];都工作

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

请注意,这类问题只会在某些情况下出现,所以在dealloc中使用self.property=nil编写代码通常是完全可能的,并且一切都很好。这不是最佳实践。

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

相关内容

  • 没有找到相关文章

最新更新