iOS懶加載
簡(jiǎn)單的講就是拖到最后一刻,萬不得已了,才加載,才開始占用資源。所謂懶加載,寫的就是其getter方法。在開發(fā)中,當(dāng)程序中需要利用的資源時(shí),在程序啟動(dòng)的時(shí)候不加載,只有在運(yùn)行當(dāng)需要這些資源的時(shí)候再去加載這些資源。
更直觀理解,就是,一個(gè)頁面中,view,data,首次加載不需要懶加載,其他的都可以理解成,由懶加載完成。因?yàn)楦某绦蜻€不需要它,呈現(xiàn),為什么要先讓它加載呢?需要時(shí)候,在加載就好啦
為什么要使用懶加載?
iPhone設(shè)備內(nèi)存有限,如果在程序在啟動(dòng)后就一次性加載將來會(huì)用到的所有資源,那么久可能會(huì)耗盡iOS設(shè)備的內(nèi)存。這些資源例如大量的數(shù)據(jù),圖片,音頻,過多的控件等。
懶加載的好處?
1.不必將創(chuàng)建對(duì)象的代碼全部寫在viewDidLoad方法中,代碼的可讀性更強(qiáng)。
2.每個(gè)屬性的getter方法中分別負(fù)責(zé)鴿子的實(shí)例化處理,代碼彼此間的獨(dú)立性更強(qiáng)。
3.只有當(dāng)真正需要資源的時(shí)候,再去加載,節(jié)省了內(nèi)存資源。
如何懶加載?
不多說,直接上代碼:
#import "ViewController.h"
@interface ViewController ()
/**
一個(gè)圖片視圖
*/
@property (nonatomic,strong) UIImageView * imageView;
@end
@implementation ViewController
/**
懶加載一個(gè)圖片視圖
@return 返回一個(gè)圖片視圖
*/
-(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");
//調(diào)用懶加載
[self imageView];
_imageView.backgroundColor=[UIColor redColor];
NSLog(@"5555555");
[self.view addSubview:_imageView];
NSLog(@"6666666");
}
下面說一下值得注意幾點(diǎn):
第一,
在需要的時(shí)候,調(diào)用懶加載時(shí)候,就是:
[self imageView];
[self.view addSubview:_imageView];
所以,也可以直接表達(dá)成:
[self.view addSubview:self.imageView]
第二,
由第一點(diǎn),可以說明,調(diào)用懶加載時(shí)候,就是調(diào)用了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;
}
那么就會(huì)出現(xiàn)“死循環(huán)”。
為什么呢?
需要時(shí)候,開始調(diào)用了懶加載,用get方法。
進(jìn)入到懶加載的方法之后,if和retrun 再次調(diào)用了self.imageView,調(diào)用了get方法。
就反反復(fù)復(fù)地,死循環(huán)啦。
可以嘗試復(fù)制代碼。
改變一下,
if和retrun 的self.imageView,
看看打印的順序就明白啦。