又叫延遲加載
能夠理解爲用到時再去加載,並且只加載一次,其實就是所謂的重寫對象的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對象
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。開發