懒加载
为什么要用懒加载
1.首先看一下程序启动过程:(如图)
- 会有一个mian的设置,程序一启动会加载
main.storyboard
main.storyboard
又会加载箭头所指的控制器- 控制器一旦加载,就会加载
view
里面创建的子控件 - 直到
view
里面的所有东西都创建完以后,就会加载plist数据
2.为什么要用懒加载
- 程序一启动,数据就会加载完成,但有时可能数据较大,而且数据加载完成后,用户很有可能会很长时间用不到这些数据,这样会使得程序一启动,就会占用很大的内存,很浪费。因此,我们一般会选用懒加载对数据进行加载。
什么是懒加载
顾名思义,懒就是懒惰。懒加载就是用到的时候再加载,不用就不加载,而且也只加载一次。
懒加载的思路
懒加载其实就是重写get方法
(前面已经定义好了一个NSArrary
数组,数组名为shops)
-(NSArrary *)shops {
NSBundle *bundle = [NSBundle mainBundle];
NSString *file = [bundle pathForResource:@"shops" ofType:@"plist"];
_shops = [NSArray arrayWithContentsOfFile:file];
return _shops;
}
如果就这么写的话,会出现一个问题,就是下面的代码中每调用一次都会重新加载一次,而我们想要实现的是文件只加载一次,因此要在前面加一个判断,在每次调用的时候判断数据是否为空,如果不为空,就不需要加载,直接用就可以了
-(NSArrary *)shops {
if(_shops == nil) {
NSBundle *bundle = [NSBundle mainBundle];
NSString *file = [bundle pathForResource:@"shops" ofType:@"plist"];
_shops = [NSArray arrayWithContentsOfFile:file];
}
return _shops;
}
使用懒加载的好处
在ios6、7那会,会有一个-(void) viewDidUnload;
方法,当内存发生不足警告的时候,系统会自动调用该方法,将一些不常用的控制器删掉,同时会将plist文件销毁,以释放内存空间。如果不用懒加载,那么当再次出发该控制器时,便再也找不到数据了,程序就没法运行。而用了懒加载后,可以保证无论什么时候内存被清掉,但只要想用,就能重新加载出数据。
注意点
上面代码中出现了三个_shops
,那么这三处能不能换成self.shops
呢?我们知道_shops是直接访问成员变量,而self.shops是调用shops的getter\setter方法。
- 第一处:从代码中可以看出,第一处的_shops显然是拿出它的值与nil进行比较,既然是拿出值,就应该是调用get方法,如果改成
self.shops
,就相当于[self shops]
,这样程序一来到if判断语句,就会调用shops的get方法,也就是调用自己本身,这样就陷入了死循环。 - 第三处:同理,return语句就是取出值进行返回,既然是取出,就是调用get方法,这样也会陷入死循环。
- 第二处:从代码看,是将后面的值赋给_shops,既然是赋值,那就是调用set方法,因此如果将这里的_shops换成self.shops的话,是相当于
[self setShops]
,这里是可以的
因此在使用self的时候,一定要小心是调用get还是set方法,以免陷入死循环。
作者:黎明豌豆
出处:http://www.cnblogs.com/PeaZora/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此字段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利
愿你求知如饥,愿你虚心若愚