懒加载
懒加载,亦叫延迟加载,即在第一次需要的时候才去加载,本质上就是对一个实例的getter方法的重写。
我的理解是, 有些可能不会显示的控件用懒加载写, 比如下拉刷新到的东西, 如果不下拉就不会显示
优点
- 占用内存较小
- 代码的可读性更强
- 每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强
缺点
- 代码量增加
- 使用不得当,可能造成死循环
代码实现label的一个懒加载
- (UILabel *)label {
if (!_label) {
_label = [[UILabel alloc] init];
_label.frame = CGRectMake(64, 64, 300, 50);
_label.backgroundColor = [UIColor cyanColor];
_label.text = @"懒加载就是当需要的时候才去加载";
[self.view addSubview:_label];
}
return _label;
}
懒加载的注意点
使用懒加载时,必须注意getter方法嵌套,从而造成死循环,导致程序crash!, 比如,我们写成这样:
- (UILabel *)label {
// 注意这里会造成程序奔溃,getter方法自身嵌套循环,永无休止
if (!self.label) {
_label = [[UILabel alloc] init];
_label.frame = CGRectMake(64, 64, 300, 50);
_label.backgroundColor = [UIColor cyanColor];
_label.text = @"懒加载就是当需要的时候才去加载";
}
return _label;
}
有一种万无一失、永远也不会造成死循环的方法,那就是懒加载的方法名不要和懒加载内部的实例变量同名,这样Xcode就可以准确识别出你调用的是属性还是懒加载方法,比如:
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) UILabel *label;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self lazyMethod];
}
- (UILabel *)lazyMethod {
if (!self.label) {
_label = [[UILabel alloc] init];
_label.frame = CGRectMake(64, 64, 300, 50);
_label.backgroundColor = [UIColor cyanColor];
_label.text = @"懒加载就是当需要的时候才去加载";
[self.view addSubview:_label];
}
return self.label;
}
@end