- 懒加载
又叫延迟加载
可以理解为用到时再去加载,而且只加载一次,其实就是所谓的重写对象的get 方法,当系统或者开发者者调用对象的get 方法时,再去加载对象。
需要注意的是:重写get 方法时,先判断对象当前是否为空,为空的话,再去实例化对象。
再有,在调用的对应成员变量的时候,需要使用self.var,_var 的时候是不会访问 getter 方法的,即不会去懒加载了。
- 使用懒加载的好处:
不必将创建对象的代码全部写在viewDidLoad 方法中,代码的可读性更强;
每个控件的getter 方法中分别负责各自的实例化处理,代码彼此之间的独立性强,低耦合;
对系统的内存占用率会减小。
- 懒加载的示例
@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
- 懒加载延伸之self.var 和 _var 的区别
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。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。