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

Objective-C文档的Apple 编程指出:

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

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

答案很简单 – 这是代码味道。 像self.foobar = something点符号self.foobar = something Objective-C中的self.foobar = something只是消息的语法糖。 发送消息给self通常很好。 但是有两种情况需要避免:

1.当对象被创build时,

2.物体被毁坏时。

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

如果一个setter方法被一个子类覆盖,你不能保证你的实例variables将包含正确的数据。 如果要在初始化等关键阶段保持对象内的数据完整性,则应按照Apple的build议进行操作。

除了@JacobRelkin点,副作用可以包括键值观察。 其他对象甚至可以在-init*-dealloc期间观察更改。 过去我有一个KVO -dealloc错误。

直接build立和拆除ivars是最好的实践。