一、基本概念
懒加载(Lazy Loading)也称为延迟加载,是一种常见的优化技术,它可以延迟对象的创建或初始化,直到这个对象被真正使用时再去创建或初始化,简单的说就是当我们运行时需要一些资源的时候再加载这些资源。
它的特点是效率低但是占用内存少,也就相当于用时间来换空间。
使用懒加载可以帮助我们避免在不必要的时候创建或初始化对象,从而节省时间和资源。此外,懒加载还可以帮助我们更好地组织代码,使代码更加清晰易懂。
需要注意的是,懒加载并不是适用于所有情况的优化技术。如果一个对象的创建或初始化时间非常短,或者这个对象的使用频率非常高,那么使用懒加载可能会带来额外的性能开销
懒加载通常用于那些需要耗费大量时间或资源才能被创建或初始化的对象,例如视图控制器中的视图、网络请求、数据库连接等等。
它的本质其实就是重写getter方法,因为要得到实现了上述功能的对象,我们就需要添加逻辑,然后返回经过该逻辑判断的对象,此时也就需要重写getter方法了。
二、实现方法
首先是定义控件的成员变量和属性
{
//定义成员变量
UIView* _myView;
}
//定义属性
@property (nonatomic, strong)UIView* myView;
需要注意的是,定义控件属性时必须用strong修饰,至于为什么先来简单看一下strong和weak的区别。strong是一个对象只要有strong指针指向它,那么它就不会被释放,而weak型的指针变量仍然可以指向一个对象,但不属于对象的拥有者。即当对象被销毁的时候,这个weak指针也就自动指向nil(空指针)。也就是说如果我们用weak修饰控件的话,当我们将控件进行创建并初始化时还没来得及将其赋给一个指针并添加到视图上时就被自动释放掉了,也就相当于创建失败了。
还有需要注意的就是用strong修饰会让一个控件的生命周期随着你的控制器被销毁才去释放;如果使用weak修饰的话仅仅是让它在被移除之后就被销毁。
前面提到它可以延迟对象的创建或初始化,直到这个对象被真正使用时再去创建或初始化,那么该如何实现呢,显然我们可以重写属性的getter方法,在里面添加自己的逻辑,也就是当我们需要创建该实例对象时先判断一下该对象是否已经创建过了,如果创建过直接返回该对象,如果没有再创建。
- (UIView*)myView {
if (_myView == nil) {
_myView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
_myView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:_myView];
}
return _myView;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor blackColor];
[self myView];
}
运行结果如下:
需要注意的是,此处的_myView不能写成self.myView,这是因为我们当前在重写myView的getter方法,此处如果使用self.myView的话相当于调用了_myView的getter方法,这样就会陷入循环。