懒加载

为什么要用懒加载

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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此字段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利

posted @ 2016-11-07 20:32  窝窝小  阅读(600)  评论(5编辑  收藏  举报