懒加载
在iOS的开发过程中,我们经常需要初始化一些实例变量来存储一些数据或者创建一些View来展示一些数据,通常我们喜欢直接在viewDidLoad或者是其他ViewController的生命周期函数中直接创建。但这并不是最好的办法。因为我们并不是创建出来就要使用它,或许会等一段时间再使用。那就没必要在一开始就创建它,毕竟手持设备的资源相对有限,我们要充分利用起来。懒加载随之而生,示例代码如下:
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSMutableArray * arr1;
@property (nonatomic, strong) NSMutableArray * arr2;
@end
@implementation ViewController
- (NSMutableArray *)arr1{
if (!_arr1) {
_arr1 = [[NSMutableArray alloc] init];
for (int i = 0; i < 10; i++) {
[_arr1 addObject:[NSString stringWithFormat:@"arr1 -- > %zd", i]];
}
}
return _arr1;
}
- (NSMutableArray *)arr2{
if (!_arr2) {
_arr2 = [[NSMutableArray alloc] init];
for (int i = 0; i < 10; i++) {
[_arr2 addObject:[NSString stringWithFormat:@"arr2 -- > %zd", i]];
}
}
return _arr2;
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"arr1 ---> %@", _arr1);
NSLog(@"arr2 ---> %@", self.arr2);
// Do any additional setup after loading the view, typically from a nib.
}
运行上述代码,此时我们可以看到控制台的打印结果如下:
2015-02-16 00:01:56.566 TestNSarray[16107:214529] arr1 ---> (null)
2015-02-16 00:02:06.986 TestNSarray[16107:214529] arr2 ---> (
"arr2 -- > 0",
"arr2 -- > 1",
"arr2 -- > 2",
"arr2 -- > 3",
"arr2 -- > 4",
"arr2 -- > 5",
"arr2 -- > 6",
"arr2 -- > 7",
"arr2 -- > 8",
"arr2 -- > 9"
)
为什么会这样呢?为什么arr1是空的?在懒加载的代码里打个断点,可以发现arr1的懒加载方法根本就没有执行,为什么呢?
比较arr1和arr2可得出如下结论:
数组 | 懒加载方法 | 调用方式 |
---|---|---|
arr1 | 和arr2相同 | 直接访问实例变量 |
arr2 | 和arr1相同 | 调用存取方法 |
从上面的比对中我们可以得出结论:如果使用了懒加载技术,那么我们使用变量时一定要调用变量的存取属性,而不能直接访问实例变量。