懒加载
相关概念
为了减小内存消耗,在程序启动时不一次性加载所有的资源,而是在需要一些资源的时候再去加载。(效率低,内存小)
懒加载也称延迟加载,实际上就是对getter方法的重写
懒加载使用时,属性必须用strong修饰
strong会使修饰对象的引用计数加一,而weak不会。如果一个对象的引用计数为0是系统会自动销毁它。如果想让一个控件的生命周期随着控制器的小会才去释放,那就使用strong,如果仅仅是想让它在被移除视图之后就被销毁,可以使用weak。
使用步骤
在.h文件中设置一个label属性
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController{
UILabel* _label;
}
@property (nonatomic,strong)UILabel* label;
@end
在.m文件中重写getter方法并调用getter方法
- (void)viewDidLoad {
[super viewDidLoad];
[self Label];
// Do any additional setup after loading the view.
}
- (UILabel *)Label {
if (!_label) {
_label = [[UILabel alloc] init];
_label.text = @"iOS";
_label.frame = CGRectMake((self.view.frame.size.width)/2-100, (self.view.frame.size.height)/2-100, 100, 100);
[self.view addSubview:_label];
}
return _label;
}
==在重写方法里的_label不要写成self.label。必须完全按照上边的格式,如果将任意一个_label换成self.label,就相当于调用这个歌方法,在外部调用的时候就形成无限循环
优点
- 只有党真正需要资源时,再去记载,节省内存资源
- 不必将代码全部写在viewDidLoad方法中,提高代码可读性
- 防止了实例为nil的情况。
缺点
- 增加代码量
- 容易造成循环引用,导致程序崩溃。
注意
if (!_label)可以写成if (_label = = nil),不可以写成 if (self.label == nil)。会造成循环引用。
_label为成员变量,是由属性附加生成的成员变量。而self.label为调用属性label的点语法。在没有重写之前两个返回的值相同。
重写getter方法时,西安判断对象当前是否为空,为空的话再去实例化对象