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