2017.2.17
在TableView的代理方法中,
- (NSInteger)tableView:(UITableView*)tableView ? numberOfRowsInSection:(NSInteger)section{returnself.dataArray.count;}
這句 return self.dataArray.count;
其實就是利用
@property (nonatomic, strong) NSArray *dataArray;
@property的特性,為屬性生成了get和set方法,而這里調(diào)用的get方法,但是上述代碼中return self.dataArray.count會調(diào)用下面這句
- (NSArray *)dataArray {
return _dataArray
}
這樣調(diào)用,如果成員屬性dataArray開始沒有復(fù)制的,那么在使用的時候,調(diào)用get方法,不重寫的話,會報錯,空指針,所以一般我們會重新get方法
//重寫get方法- (NSArray *)dataArray{? ?if (nil == _dataArray){? ? ? ?_dataArray = [NSArray array];? ?}? ?return _dataArray}
這樣就防止了成員屬性沒有賦值的情況
綜上所述,oc的懶加載其實就是調(diào)用成員屬性的get方法,初始化值,而swift的懶加載和oc不同
在swift存儲屬性必須初始化,確認(rèn)類型,或者用可選類型,總之要確認(rèn)類型,畢竟swift是類型安全語言,所以swift提出了lazy屬性,用法如下
//1.分析 NSArray 是一個閉包的返回值,而這是一個沒有參數(shù)的閉包lazyvardataArray:NSArray= {[]} ()//2.也可以寫成這樣 lazy var dataArray:NSArray = { return NSArray() }()//3.從plist文件加載lazyvardataArray:Array = {letwinePath =NSBundle.mainBundle().pathForResource("wine.plist", ofType:nil)!letwinesM =NSMutableArray(contentsOfFile: winePath);vartmpArray:Array! = []fortmpWineDictinwinesM! {varwine:XWWine=XWWine.wineWithDict(tmpWineDictas!NSDictionary)? ? ? ? ?tmpArray.append(wine)? ? ?}print("我就運行一次")returntmpArray }()
上述代碼可以看成是一個代碼塊,然后self.dataArray的時候,就執(zhí)行了代碼塊,但是重復(fù)調(diào)用,lazy屬性的代碼塊只會調(diào)用一次,lazy修飾的是一個存儲屬性,兒存放的是閉包。
懶加載就是惰性初始化,即在變量第一次使用的時候才進行初始化
swift中有兩種方式倆惰性初始化
1.簡單表達式
lazy var first = NSArray(objects: "1", "2")
2.閉包
lazy var second:String = {
return "second"
} ( )
注意:
不要忘記最后的小括號。只有加了小括號,閉包才會在調(diào)用的時候立刻執(zhí)行。
要類型聲明lazy var second:String,這樣Xcode會進行類型檢查。