懶加載

  • 懶加載

又叫延遲加載
能夠理解爲用到時再去加載,並且只加載一次,其實就是所謂的重寫對象的get 方法,當系統或者開發者者調用對象的get 方法時,再去加載對象。
須要注意的是:重寫get 方法時,先判斷對象當前是否爲空,爲空的話,再去實例化對象。
再有,在調用的對應成員變量的時候,須要使用self.var,_var 的時候是不會訪問 getter 方法的,即不會去懶加載了。atom

  • 使用懶加載的好處:

沒必要將建立對象的代碼所有寫在viewDidLoad 方法中,代碼的可讀性更強;
每一個控件的getter 方法中分別負責各自的實例化處理,代碼彼此之間的獨立性強,低耦合;
對系統的內存佔用率會減少。code

  • 懶加載的示例
@interface ViewController ()
@property (nonatomic, copy) NSArray *array;    // 1
@end

@implementation ViewController
 - (NSArray *)array {                         // 2
    if(!_array) {                            // 3
        _array = @[@1, @2, @3];              // 4
    }
    return _array;                           // 5
}        
@end

從代碼中能夠看出,懶加載其實是對對象getter 方法的重寫。
裏面還有一些須要注意的點,以下:
1: 在該類中聲明瞭一個array 屬性
2: 重寫array 的getter 方法
3: 不可使用self.array,self.array 經過getter 方法訪問的對象,而自己這一個懶加載又是一個getter 方法,會造成死循環。
4: 使用self.array 或者 _array 均可以,採起哪一個,本身去權衡就能夠了
5: 同3對象

  • 懶加載延伸之self.var 和 _var 的區別

property & instance variable
在類內部可使用 _var 來訪問實例變量,可是getter、setter 不會被調用,而來自外部的訪問,須要經過 getter、setter,即點語法來訪問對應的屬性。
(點語法只是訪問setter、getter 方法,不是使用成員變量。實際上,能夠理解成 self.var = _var + setter + getter)
代碼示例:內存

// 在.h 文件中
@property (copy, nonatomic) NSString *var;

// 至關於在.h 中
NSString *_var;
- (NSString *)var {
    return _var;
}
- (void)setVar:(NSString *)var {
    _var = var;
}

聯繫上方的兩份代碼:
在getter 中,必須使用 _var 訪問,試想如若在getter 中使用 self.var 訪問,則又會觸發屬性的 getter,從而進入了一個死循環,最終致使程序crash。
如果在setter 中,使用self.var 也會觸發屬性的setter。開發

相關文章
相關標籤/搜索