援引:https://www.jianshu.com/p/3287b13c90fbphp
咱們知道iOS設備的內存有限,若是程序在啓動後就一次性加載未來會用到的全部資源,那麼將有可能會耗盡iOS設備的內存。這些資源例如大量數據、圖片、音頻等等數組
懶加載:也稱延遲加載,說的通俗一點,就是在開發中,當程序中須要利用的資源時。在程序啓動的時候不加載資源,只有在運行當中須要一些資源時,再去加載這些資源,即在須要的時候才加載(效率低,佔用內存小),所謂懶加載,寫的是其get
方法。app
提醒:這是蘋果公司提倡的作法,其實蘋果公司作的iOS系統中不少地方都用到了懶加載的方式,好比控制器的view的建立佈局
注意:若是是懶加載的話則必定要注意先判斷是否已經有了,若是沒有那麼再去進行實例化atom
viewDidLoad
方法中,代碼的可讀性更強getter
方法中分別負責各自的實例化方法,代碼彼此之間的獨立性強,鬆耦合定義控件屬性,屬性必須是strong的 //建立一個可變數組 @property (nonatomic, strong) NSMutableArray * dataArray; @property (nonatomic, strong) UILabel * title_lab; 重寫這個屬性對應的getter,將要實現的邏輯放在getter中 //重寫這個屬性 -(NSMutableArray *)dataArray { //判斷字典是否已經存在,若沒有,則進行實例化 if (_dataArray == nil) { _dataArray = [[NSMutableArray alloc]init]; } return _dataArray; } -(UILabel *)title_lab { if (!_title_lab) { self.title_lab = [[UILabel alloc]init]; self.title_lab.textAlignment = NSTextAlignmentCenter; self.title_lab.textColor = [UIColor blueColor]; self.title_lab.text = @"lazyLoad"; [self.title_lab sizeToFit]; [self.view addSubview:self.title_lab]; } return _title_lab; }
注意一:指針循環引用問題spa
if (_dataArray == nil) 不能夠寫成 if (self.dataArray == nil) ,否則會形成循環引用指針 return _dataArray 不能夠寫成return self.dataArray 否則會造成循環引用
注意二:關於佈局的問題指針
若是用Masonry
佈局頁面的話,關於frame
的代碼必定不能放在重寫的get
方法裏,否則會報找不到父視圖
的錯誤,要放在addSubview
後面
報錯:code
2017-03-30 11:38:54.448 TestLazyLode[3885:93478] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'couldn't find a common superview for <UILabel: 0x7fed98709ba0; frame = (0 0; 68.5 20.5); text = 'lazyLoad'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x60000009eaa0>> and <UIView: 0x7fed98405860; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x60800002aee0>>'
正確寫法代碼:blog
// // ViewController.m // TestLazyLode // // Created by taobaichi on 2017/3/30. // Copyright © 2017年 MaChao. All rights reserved. // #import "ViewController.h" #import "Masonry.h" @interface ViewController () @property (nonatomic, strong) UILabel * title_lab; @end @implementation ViewController -(UILabel *)title_lab { if (!_title_lab) { self.title_lab = [[UILabel alloc]init]; self.title_lab.textAlignment = NSTextAlignmentCenter; self.title_lab.textColor = [UIColor blueColor]; self.title_lab.text = @"lazyLoad"; [self.title_lab sizeToFit]; } return _title_lab; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //只是加載到預想加載的view上,不在初始化方法裏爲其alloc/init。只是一個指針,不會佔內存 [self.view addSubview:self.title_lab]; //Masonry佈局設置必須寫在addSubview:以後 [self.title_lab mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self.view.mas_centerX); make.centerY.equalTo(self.view.mas_centerY); make.size.mas_equalTo(CGSizeMake(100, 40)); }]; } @end