iOS懶加載



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,
看看打印的順序就明白啦。

文章僅供參考,如果寫錯(cuò)了,請(qǐng)及時(shí)留言我及時(shí)更正。謝謝您支持
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,909評(píng)論 25 709
  • 寫在前面 昨天晚上寫的那個(gè)代碼在配置數(shù)組數(shù)據(jù)的時(shí)候突然想到加載數(shù)據(jù)的時(shí)候可以不用在viewDidLoad中加載,可...
    劉光軍_MVP閱讀 2,371評(píng)論 1 6
  • 寫在前面 代碼在配置數(shù)組數(shù)據(jù)的時(shí)候可以不用在viewDidLoad中加載,可以什么時(shí)候用什么時(shí)候加載,這種技術(shù)就是...
    無灃閱讀 261評(píng)論 0 0
  • 懶加載 1.懶加載 懶加載——也稱為延遲加載,即在需要的時(shí)候才加載(效率低,占用內(nèi)存?。?。所謂懶加載,寫的是其ge...
    Eddiegooo閱讀 1,794評(píng)論 0 2
  • 最近朋友圈流行抽簽測(cè)算運(yùn)勢(shì),我也跟風(fēng)抽了一簽:旅行。 作者 我叫回聲,他叫許原風(fēng),我見他第一眼的時(shí)候,陽光正好從他...
    b629bce7c08d閱讀 225評(píng)論 0 2

友情鏈接更多精彩內(nèi)容