又叫延迟加载
能够理解为用到时再去加载,并且只加载一次,其实就是所谓的重写对象的get 方法,当系统或者开发者者调用对象的get 方法时,再去加载对象。
须要注意的是:重写get 方法时,先判断对象当前是否为空,为空的话,再去实例化对象。
再有,在调用的对应成员变量的时候,须要使用self.var,_var 的时候是不会访问 getter 方法的,即不会去懒加载了。atom
没必要将建立对象的代码所有写在viewDidLoad 方法中,代码的可读性更强;
每一个控件的getter 方法中分别负责各自的实例化处理,代码彼此之间的独立性强,低耦合;
对系统的内存占用率会减少。code
@interface ViewController () @property (nonatomic, copy) NSArray *array; // 1 @end @implementation ViewController - (NSArray *)array { // 2 if(!_array) { // 3 _array = @[@1, @2, @3]; // 4 } return _array; // 5 } @end
从代码中能够看出,懒加载其实是对对象getter 方法的重写。
里面还有一些须要注意的点,以下:
1: 在该类中声明了一个array 属性
2: 重写array 的getter 方法
3: 不可使用self.array,self.array 经过getter 方法访问的对象,而自己这一个懒加载又是一个getter 方法,会造成死循环。
4: 使用self.array 或者 _array 均可以,采起哪一个,本身去权衡就能够了
5: 同3对象
property & instance variable
在类内部可使用 _var 来访问实例变量,可是getter、setter 不会被调用,而来自外部的访问,须要经过 getter、setter,即点语法来访问对应的属性。
(点语法只是访问setter、getter 方法,不是使用成员变量。实际上,能够理解成 self.var = _var + setter + getter)
代码示例:内存
// 在.h 文件中 @property (copy, nonatomic) NSString *var; // 至关于在.h 中 NSString *_var; - (NSString *)var { return _var; } - (void)setVar:(NSString *)var { _var = var; }
联系上方的两份代码:
在getter 中,必须使用 _var 访问,试想如若在getter 中使用 self.var 访问,则又会触发属性的 getter,从而进入了一个死循环,最终致使程序crash。
如果在setter 中,使用self.var 也会触发属性的setter。开发