懒加载简介
懒加载,顾名思义,就是不用它的时候不加载,换句话说,就是只有使用它的时候它才加载,故在某些情况下可以节省空间
所谓懒加载,就是推迟它的getter方法的执行。
self.showImageView和_showImageView的区别
- self.showImageView为属性showImageView的点语法
- _showImageView是属性附加生成的成员变量
- 在没重写getter方法前两者是相同的,调用self.showImageView是下面这个方法
- (UIImageView *)showImageView{
return _showImageview;
}
可见,self.showImageView就相当于_showImageview
- 重写后self.showImageView返回懒加载后的对象,而直接调用_showImageview返回的是初始化的对象
viewDidLoad正常加载代码
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
_showImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"t2.jpg"]];
_showImageView.frame = CGRectMake(50, 50, 100, 150);
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self.view addSubview:_showImageView];
}
我们可以看出,showImageView在一开始需要显示界面时就已经加载好了,开始占用内存。但是showImageView只有在某些特定情况下才被使用(示例中是点击界面),那么如果事件不被触发,showImageView就不必加载去耗费内存
懒加载代码
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self showImageView];
[self.view addSubview:_showImageView];
}
- (UIImageView *)showImageView {
if (!_showImageView) {
_showImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"t2.jpg"]];
_showImageView.frame = CGRectMake(50, 50, 100, 150);
}
return _showImageView;
}
可以看出,只有当需要用到showImageView的时候,调用showImageView的getter方法([self showImageView]),showImageView才被加载
注意:使用懒加载时getter方法里不能写成self.showImageView,否则会一直调用[self showImageView]方法,陷入死循环