iOS懒加载
简单的讲就是拖到最后一刻,万不得已了,才加载,才开始占用资源。所谓懒加载,写的就是其getter方法。在开发中,当程序中需要利用的资源时,在程序启动的时候不加载,只有在运行当需要这些资源的时候再去加载这些资源。
更直观理解,就是,一个页面中,view,data,首次加载不需要懒加载,其他的都可以理解成,由懒加载完成。因为改程序还不需要它,呈现,为什么要先让它加载呢?需要时候,在加载就好啦
为什么要使用懒加载?
iPhone设备内存有限,如果在程序在启动后就一次性加载将来会用到的所有资源,那么久可能会耗尽iOS设备的内存。这些资源例如大量的数据,图片,音频,过多的控件等。
懒加载的好处?
1.不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强。
2.每个属性的getter方法中分别负责鸽子的实例化处理,代码彼此间的独立性更强。
3.只有当真正需要资源的时候,再去加载,节省了内存资源。
如何懒加载?
不多说,直接上代码:
#import "ViewController.h"
@interface ViewController ()
/**
一个图片视图
*/
@property (nonatomic,strong) UIImageView * imageView;
@end
@implementation ViewController
/**
懒加载一个图片视图
@return 返回一个图片视图
*/
-(UIImageView *)imageView{
NSLog(@"11111111");
if (!_imageView) {
NSLog(@"2222222");
_imageView=[[UIImageView alloc]init];
NSLog(@"3333333");
[_imageView setFrame:CGRectMake(50, 50, 100, 100)];
}
NSLog(@"444444");
return _imageView;
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"000000");
//调用懒加载
[self imageView];
_imageView.backgroundColor=[UIColor redColor];
NSLog(@"5555555");
[self.view addSubview:_imageView];
NSLog(@"6666666");
}
下面说一下值得注意几点:
第一,
在需要的时候,调用懒加载时候,就是:
[self imageView];
[self.view addSubview:_imageView];
所以,也可以直接表达成:
[self.view addSubview:self.imageView]
第二,
由第一点,可以说明,调用懒加载时候,就是调用了get方法。
所以如果,懒加载写成如下:
-(UIImageView *)imageView{
NSLog(@"11111111");
if (!self.imageView) {
NSLog(@"2222222");
_imageView=[[UIImageView alloc]init];
NSLog(@"3333333");
[_imageView setFrame:CGRectMake(50, 50, 100, 100)];
}
NSLog(@"444444");
return _imageView;
}
或者:
-(UIImageView *)imageView{
NSLog(@"11111111");
if (!_imageView) {
NSLog(@"2222222");
_imageView=[[UIImageView alloc]init];
NSLog(@"3333333");
[_imageView setFrame:CGRectMake(50, 50, 100, 100)];
}
NSLog(@"444444");
return self.imageView;
}
那么就会出现“死循环”。
为什么呢?
需要时候,开始调用了懒加载,用get方法。
进入到懒加载的方法之后,if和retrun 再次调用了self.imageView,调用了get方法。
就反反复复地,死循环啦。
可以尝试复制代码。
改变一下,
if和retrun 的self.imageView,
看看打印的顺序就明白啦。
网友评论