懶加載并沒有什么太過特別的地方,但是要注意幾點:
- 如果用懶加載寫的view急鳄,比如
//注意:懶加載時,只有用 self 才能調(diào)其 getter 方法
[self.view addSubview:self.downTableView];
懶加載在一個文件中必須使用一次self.來觸發(fā)悼吱,無論左setting還是右getting(聽說寫在等號左調(diào)用setting,右調(diào)用getting),其他時候可以都用_.(成員變量的方式)
2.懶加載只針對屬性變量,局部變量沒有這一用法
- 如果用懶加載寫的數(shù)組辆影,在網(wǎng)絡(luò)回來的時候徒像,記得
[self.listArr removeObjectAtIndex:_row];
[self.selectedArr removeAllObjects];
remove掉哦喔。
3.懶加載的對象不用self 防止循環(huán)引用秸歧,比如:
//懶加載 webView 增加流暢度
- (UIWebView *)webView{
//注意,這里不用 self 防止循環(huán)引用
if (!_webView) {
_webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, _tableView.contentSize.height, self.view.frame.size.width, self.view.frame.size.height)];
_webView.delegate = self;
_webView.delegate = self;
_webView.scrollView.delegate = self;
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]];
}
return _webView;
}
改
- (UIWebView *)webView{
__weak typeof(self) weakSelf = self;
//注意,這里不用 self 防止循環(huán)引用
if (!_webView) {
_webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, _tableView.contentSize.height, weakSelf.view.frame.size.width, weakSelf.view.frame.size.height)];
_webView.delegate = weakSelf;
_webView.delegate = weakSelf;
_webView.scrollView.delegate = weakSelf;
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]];
}
return _webView;
}
4.純代碼布局建議用懶加載
延伸:
==
1.懶加載基本
懶加載——也稱為延遲加載厨姚,即在需要的時候才加載(效率高,占用內(nèi)存屑狻)谬墙。所謂懶加載今布,寫的是其getter方法。說的通俗一點拭抬,就是在開發(fā)中部默,當程序中需要利用的資源時。在程序啟動的時候不加載資源造虎,只有在運行當需要一些資源時傅蹂,再去加載這些資源。
我們知道iOS設(shè)備的內(nèi)存有限算凿,如果在程序在啟動后就一次性加載將來會用到的所有資源份蝴,那么就有可能會耗盡iOS設(shè)備的內(nèi)存描姚。這些資源例如大量數(shù)據(jù)展哭,圖片辙诞,音頻等等胡野,所以我們在使用懶加載的時候一定要注意先判斷是否已經(jīng)有了冰蘑,如果沒有那么再去進行實例化
2.使用懶加載的好處:
(1)不必將創(chuàng)建對象的代碼全部寫在viewDidLoad方法中额嘿,代碼的可讀性更強
(2)每個控件的getter方法中分別負責(zé)各自的實例化處理地啰,代碼彼此之間的獨立性強送粱,松耦合
(3)只有當真正需要資源時靴庆,再去加載时捌,節(jié)省了內(nèi)存資源。
(4) 然后我們通過重寫屬性的getter方法可以完成lazy loading(懶加載)模式炉抒,使用lazy loading可以將代碼按照模塊封裝奢讨,同時提高類的靈活度,也可以在一定時期內(nèi)節(jié)省內(nèi)存的使用端礼。比如:對于當前的父級View禽笑,使用lazy loading表示我提供了兩個子視圖/子控件的屬性,如果需要使用蛤奥,秩序調(diào)用getter方法既可以顯示該子視圖佳镜,如果不需要,父級視圖就是一個空的視圖
特別提醒:這是蘋果公司提倡的做法凡桥。比如控制器的View的創(chuàng)建蟀伸。視圖控制器的View屬性屬于懶加載(重寫gett方法),第一次調(diào)用view的getting方法就是當視圖控制器成為Window的根視圖控制器之后缅刽,window需要將視圖控制器的視圖顯示出來是啊掏,這個時候view屬性的getti就會判斷如果_view不存在,則調(diào)用視圖控制器的loadView方法加載視圖衰猛,在執(zhí)行viewDidLoad方法加載器索要管理的視圖
正因為此迟蜜,發(fā)現(xiàn)了colleague的一個bug:
colleague喜歡跳轉(zhuǎn)到下一個UIViewController時,用屬性來傳參的(而且他的哪些參數(shù)是要發(fā)送網(wǎng)絡(luò)請求的)啡省,如果在屬性之前就調(diào)用了self.view 比如娜睛,self.view.backgroundColor = [UIColor widthColor];因為是懶加載髓霞,所以沒有run下面的屬性參數(shù)就立即調(diào)用viewDidLoad,剛好viewDidLoad里寫了網(wǎng)絡(luò)請求畦戒,那么就因為屬性沒來得及賦參方库,而導(dǎo)致網(wǎng)絡(luò)請求失敗。