iOS 開發-懶加載

援引:https://www.jianshu.com/p/3287b13c90fbphp

懶加載

咱們知道iOS設備的內存有限,若是程序在啓動後就一次性加載未來會用到的全部資源,那麼將有可能會耗盡iOS設備的內存。這些資源例如大量數據、圖片、音頻等等數組

懶加載:也稱延遲加載,說的通俗一點,就是在開發中,當程序中須要利用的資源時。在程序啓動的時候不加載資源,只有在運行當中須要一些資源時,再去加載這些資源,即在須要的時候才加載(效率低,佔用內存小),所謂懶加載,寫的是其get方法。app

提醒:這是蘋果公司提倡的作法,其實蘋果公司作的iOS系統中不少地方都用到了懶加載的方式,好比控制器的view的建立佈局

注意:若是是懶加載的話則必定要注意先判斷是否已經有了,若是沒有那麼再去進行實例化atom

懶加載的好處:

  1. 沒必要將建立的代碼所有寫在viewDidLoad方法中,代碼的可讀性更強
  2. 每一個屬性的getter方法中分別負責各自的實例化方法,代碼彼此之間的獨立性強,鬆耦合
  3. 只有當真正須要資源時,再去加載,節省了內存資源

代碼示例:

  • 定義控件屬性,屬性必須是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
相關文章
相關標籤/搜索