NSString* urlStr = [strfstringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSetcharacterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "].invertedSet];
在程序設(shè)計(jì)中,我們經(jīng)常會使用懶加載,顧名思義,就是用到的時(shí)候再開辟空間顷编,比如iOS開發(fā)中的最常用控件UITableView,實(shí)現(xiàn)數(shù)據(jù)源方法的時(shí)候,通常我們都會這樣寫
Objective-C
- (NSInteger)tableView:(UITableView *)tableView? numberOfRowsInSection:(NSInteger)section
{
return self.dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//1.得到cell
XWShopCell *cell = [XWShopCell cellWithTableView:tableView];
//2.傳遞模型
cell.wine = self.dataArray[indexPath.row];
//3.回傳cell
return cell;
}
上面的的代碼中
return self.dataArray.count;
其實(shí)就是利用
@property (nonatomic, strong) NSArray *dataArray;
@property 的特性乎澄,為屬性生成了get和set方法,而這里是調(diào)用的get方法漠畜,但是上述代碼中return self.dataArray.count 會調(diào)用
- (NSArray *)dataArray{ return _dataArray}
這樣調(diào)用,如果成員屬性dataArray 開始沒有賦值的,那么在使用的時(shí)候瓤檐,調(diào)用get方法,不重寫的話娱节,會報(bào)錯(cuò)挠蛉,空指針,所以一般我們會重寫get方法
//重寫get方法
- (NSArray *)dataArray
{
if (nil == _dataArray){
_dataArray = [NSArray array];
}
return _dataArray
}
這樣寫,就防止了成員屬性為沒有賦值的情況
綜上所述,Objective-C的懶加載肄满,其實(shí)就是調(diào)用成員屬性的get方法谴古,初始化值,而Swift的懶加載稠歉,是和Objective-C不同的
Swift
//MARK tablview的 dataSource 代理方法
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return self.dataArray.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
//1.得到cell
let cell = XWShopCell.cellWithTableView(tableView)
//2.傳遞模型
cell.wine = self.dataArray[indexPath.row]
//3.回傳cell
return cell
}
而這句
return self.dataArray.count
在Swift 存儲屬性必須初始化掰担,確認(rèn)類型,或者用可選類型怒炸,總之要確認(rèn)類型带饱,畢竟Swfit是類型安全語言,所以Swift提出了lazy屬性,用法
//1.分析 NSArray 是一個(gè)閉包的返回值阅羹,而這是一個(gè)沒有參數(shù)的閉包
lazy var dataArray:NSArray = { [] }()
//2.也可以寫成這樣 lazy var dataArray:NSArray = { return NSArray() }()
//3.從plist文件加載
lazy var dataArray:Array = {
let winePath = NSBundle.mainBundle().pathForResource("wine.plist", ofType: nil)!
let winesM = NSMutableArray(contentsOfFile: winePath);
var tmpArray:Array! = []
for tmpWineDict in winesM! {
var wine:XWWine = XWWine.wineWithDict(tmpWineDict as! NSDictionary)
tmpArray.append(wine)
}
print("我就運(yùn)行一次")
return tmpArray }()
上述的代碼,有點(diǎn)難理解惠毁,如果之前會Objective-C的block 或者對C語言的函數(shù)指針理解透徹的嫌拣,可以看成是一個(gè)代碼塊,然后self.dataArray的時(shí)候孝宗,就執(zhí)行了代碼塊,但是重復(fù)調(diào)用耕肩,Lazy 屬性的代碼塊只會調(diào)用一次,lazy修飾的是一個(gè)存儲屬性因妇,而存放的是閉包,我想內(nèi)部,應(yīng)該進(jìn)行了優(yōu)化猿诸。
#import"ViewController.h"#import"AFNetworkReachabilityManager.h"@interfaceViewController ()@property(nonatomic, strong) NSURLSessionDownloadTask *downloadTask;// 下載任務(wù)@property(nonatomic, strong) NSURLSession *session;// 會話@property(nonatomic, strong) NSData *resumData;// 續(xù)傳數(shù)據(jù)@property(nonatomic, strong) NSDate *lastDate;// 上次獲取到數(shù)據(jù)的時(shí)間./** 兩個(gè)label都是用Storybord創(chuàng)建的. */@property(weak, nonatomic) IBOutlet UILabel *progressLabel;@property(weak, nonatomic) IBOutlet UILabel *speedLabel;@end@implementationViewController
@end