- 一般來說,在ARC下修飾delegate要用weak而不是strong
用tableview的代理(viewcontroller)例子來解釋:
如果tableview用strong強(qiáng)引用了其代理viewcontroller焚刺,viewcontroller又strong強(qiáng)引用了tableview匪蝙,就造成了循環(huán)引用主籍,誰都不能被釋放,會(huì)造成內(nèi)存泄漏逛球。用weak使tableview弱引用viewcontroller千元,不會(huì)造成循環(huán)引用。
- 而對(duì)于NSURLSession來說卻比較特殊颤绕,下面是蘋果API里面的說明
The session object keeps a strong reference to the delegate until your app exits or explicitly invalidates the session. If you do not invalidate the session by calling the invalidateAndCancel or finishTasksAndInvalidatemethod, your app leaks memory until it exits.
可以看出NSURLSession對(duì)代理是強(qiáng)引用幸海,如果不正確處理的的話,就會(huì)造成內(nèi)存泄漏奥务。
那么我們?cè)趺醋霾拍芊乐箖?nèi)存泄漏的發(fā)生呢物独,蘋果給我們提供了兩個(gè)方法,invalidateAndCancel or finishTasksAndInvalidate
- 一個(gè)是完成任務(wù)后將session給干掉氯葬,在NSURLSessionDownloadDelegate 代理方法中
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
NSLog(@"完成 %@",location);
//完成任務(wù),
[self.session finishTasksAndInvalidate];
//清空Session
self.session = nil;
}
- 一個(gè)是在控制器返回時(shí)挡篓,任務(wù)不再下載了
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
//取消會(huì)話
[self.session invalidateAndCancel];
self.session = nil;
}
怎么做看自己的選擇了,蘋果這樣做也是有原因的
- 在我們平常的網(wǎng)絡(luò)開發(fā)中,網(wǎng)絡(luò)訪問操作,封裝到一個(gè)方法中,由一個(gè)統(tǒng)一的單例對(duì)象來負(fù)責(zé)所有的網(wǎng)絡(luò)事件帚称,比如常用的AFN
- Session對(duì)代理(單例)進(jìn)行強(qiáng)引用,單例本身就是一個(gè)靜態(tài)的實(shí)例,本身就不需要釋放
補(bǔ)充
- 下載的文件在哪里
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
NSLog(@"完成 %@",location);
}
如果在回調(diào)方法中,不做任何處理,下載的文件會(huì)被刪除
通過location找到文件夾位置官研,運(yùn)行程序的時(shí)候可以看到下載文件其實(shí)是放在temp里面的,但下載完后系統(tǒng)會(huì)自動(dòng)回收這塊區(qū)域。
*設(shè)計(jì)的目的是什么?
- 通常從網(wǎng)絡(luò)上下載文件,zip 文件最多,替用戶節(jié)約流量
- 如果是 zip 包,下載之后,需要解壓
- 解壓之后,原始的 zip 文件就不需要了,系統(tǒng)會(huì)自動(dòng)幫我們刪除
- dataTask 和 downloadTask 下載對(duì)比
- NSURLSessionDataTask
下載文件可以實(shí)現(xiàn)離線斷點(diǎn)下載闯睹,但是代碼相對(duì)復(fù)雜 - NSURLSessionDownloadTask
下載文件可以實(shí)現(xiàn)斷點(diǎn)下載戏羽,但不能離線斷點(diǎn)下載
內(nèi)部已經(jīng)完成了邊接收數(shù)據(jù)邊寫入沙盒的操作
解決了下載大文件時(shí)的內(nèi)存飆升問題