2017.2.17
在TableView的代理方法中却汉,
- (NSInteger)tableView:(UITableView*)tableView ? numberOfRowsInSection:(NSInteger)section{returnself.dataArray.count;}
這句 return self.dataArray.count;
其實(shí)就是利用
@property (nonatomic, strong) NSArray *dataArray;
@property的特性病毡,為屬性生成了get和set方法,而這里調(diào)用的get方法伐脖,但是上述代碼中return self.dataArray.count會(huì)調(diào)用下面這句
- (NSArray *)dataArray {
return _dataArray
}
這樣調(diào)用慧脱,如果成員屬性dataArray開始沒有復(fù)制的拍皮,那么在使用的時(shí)候隧膏,調(diào)用get方法,不重寫的話包颁,會(huì)報(bào)錯(cuò)瞻想,空指針,所以一般我們會(huì)重新get方法
//重寫get方法- (NSArray *)dataArray{? ?if (nil == _dataArray){? ? ? ?_dataArray = [NSArray array];? ?}? ?return _dataArray}
這樣就防止了成員屬性沒有賦值的情況
綜上所述娩嚼,oc的懶加載其實(shí)就是調(diào)用成員屬性的get方法蘑险,初始化值,而swift的懶加載和oc不同
在swift存儲(chǔ)屬性必須初始化待锈,確認(rèn)類型,或者用可選類型嘴高,總之要確認(rèn)類型竿音,畢竟swift是類型安全語言,所以swift提出了lazy屬性拴驮,用法如下
//1.分析 NSArray 是一個(gè)閉包的返回值春瞬,而這是一個(gè)沒有參數(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("我就運(yùn)行一次")returntmpArray }()
上述代碼可以看成是一個(gè)代碼塊,然后self.dataArray的時(shí)候套啤,就執(zhí)行了代碼塊宽气,但是重復(fù)調(diào)用随常,lazy屬性的代碼塊只會(huì)調(diào)用一次,lazy修飾的是一個(gè)存儲(chǔ)屬性萄涯,兒存放的是閉包坪它。
懶加載就是惰性初始化绩社,即在變量第一次使用的時(shí)候才進(jìn)行初始化
swift中有兩種方式倆惰性初始化
1.簡單表達(dá)式
lazy var first = NSArray(objects: "1", "2")
2.閉包
lazy var second:String = {
return "second"
} ( )
注意:
不要忘記最后的小括號(hào)。只有加了小括號(hào),閉包才會(huì)在調(diào)用的時(shí)候立刻執(zhí)行个扰。
要類型聲明lazy var second:String,這樣Xcode會(huì)進(jìn)行類型檢查谈撒。