为什么我应该直接从初始化方法中访问实例变量?

时间:2013-07-17 14:56:25

标签: ios objective-c

Apple Programming with Objective-C文件指出:

  

您应该始终直接从内部访问实例变量   一个初始化方法,因为在设置属性时,   对象的其余部分可能尚未完全初始化。即使你   不提供自定义访问器方法或知道任何副作用   在你自己的类中,未来的子类可能会很好地覆盖   行为。

但是我不知道setter方法会有什么副作用,请举个例子来解释为什么我必须直接从初始化方法中访问实例变量

3 个答案:

答案 0 :(得分:4)

答案很简单 - 这是代码味道。 Objective-C中的self.foobar = something之类的点符号只是用于消息传递的语法糖。 向self发送消息通常没问题。但是有两种情况需要避免它们:

1。在创建对象时,和

2。当物体被摧毁时。

在这两次,对象处于一种奇怪的中间状态。它缺乏诚信。在这些时间调用方法是代码味道,因为每个方法都应该在对象上操作时保持不变量。

答案 1 :(得分:3)

如果子类重写了setter方法,则无法保证实例变量将包含正确的数据。如果要在初始化等关键阶段保持对象内的数据完整性,则应按照Apple的建议进行操作。

答案 2 :(得分:0)

除了@JacobRelkin点之外,副作用还包括键值观察。即使在-init*-dealloc期间,其他对象也可以观察到更改。我过去曾经遇到过KVO -dealloc错误。

直接设置和拆除ivars确实是最佳做法。