为什么我应该直接从初始化方法中访问实例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是最好的实践。