Apple Programming with Objective-C文件指出:
您应该始终直接从内部访问实例变量 一个初始化方法,因为在设置属性时, 对象的其余部分可能尚未完全初始化。即使你 不提供自定义访问器方法或知道任何副作用 在你自己的类中,未来的子类可能会很好地覆盖 行为。
但是我不知道setter方法会有什么副作用,请举个例子来解释为什么我必须直接从初始化方法中访问实例变量
答案 0 :(得分:4)
答案很简单 - 这是代码味道。 Objective-C中的self.foobar = something
之类的点符号只是用于消息传递的语法糖。
向self
发送消息通常没问题。但是有两种情况需要避免它们:
1。在创建对象时,和
2。当物体被摧毁时。
在这两次,对象处于一种奇怪的中间状态。它缺乏诚信。在这些时间调用方法是代码味道,因为每个方法都应该在对象上操作时保持不变量。
答案 1 :(得分:3)
如果子类重写了setter方法,则无法保证实例变量将包含正确的数据。如果要在初始化等关键阶段保持对象内的数据完整性,则应按照Apple的建议进行操作。
答案 2 :(得分:0)
除了@JacobRelkin点之外,副作用还包括键值观察。即使在-init*
和-dealloc
期间,其他对象也可以观察到更改。我过去曾经遇到过KVO -dealloc
错误。
直接设置和拆除ivars确实是最佳做法。