当实例化一个对象需要耗费很多资源,或者配置一次就要调用很多配置相关的方法而你又不想弄乱这些方法时,我们需要重写 getter 方法以延迟实例化,而不是在 init 方法里给对象分配内存。 运用懒加载可以很好的解决这一问题。 所谓的懒加载也可称为:延时加载,即当对象需要用到的时候再去加载。(本质就是重写对象的get方法,当系统或开发者 调用对象的get方法时,再去加载对象)。 需要注意的是:重写get方法时,先判断对象当前是否为空,为空的话再去实例化对象。
懒加载一般使用如下模板:
使用懒加载前你可能会将对象的实例化写到viewDidLoad,这与viewDidLoad中代码显得很冗余,并且耗用内存。 使用懒加载之后每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合。 使用懒加载在某些情况下很不错,但是实际这样做之前应当深思熟虑。下面是使用延迟实例化的争议:
*getter 方法应该避免副作用。看到 getter 方法的时候,你不会想到会因此创建一个对象或导致副作用,实际上如果调用 getter 方法而不使用其返回值编译器会报警告 “Getter 不应该仅因它产生的副作用而被调用”。
*你在第一次访问的时候改变了初始化的消耗,产生了副作用,这会让优化性能变得困难(以及测试).
*这个初始化可能是不确定的:比如你期望属性第一次被一个方法访问,但是你改变了类的实现,访问器在你预期之前就得到了调用,这样可以导致问题,特别是初始化逻辑可能依赖于类的其他不同状态的时候。总的来说最好明确依赖关系.
*这个行为不是 KVO 友好的。如果 getter 改变了引用,他应该通过一个 KVO 通知来通知改变。当访问 getter 的时候收到一个改变的通知很奇怪。