NSURLSession時(shí)需要注意一個(gè)內(nèi)存泄漏問題

  1. 第一種情況
    單獨(dú)初始化 NSURLSession
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://baidu.com"]];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//    self.session = session;
    [[session dataTaskWithRequest:request] resume];

設(shè)置代理,并在代理方法

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
    didReceiveData:(NSData *)data {
    NSLog(@"=====%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
//    [self.session finishTasksAndInvalidate];
    
}

運(yùn)行,打開 instruments 會(huì)看到

Snip20170928_3.png
  1. 第二種情況,使用
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://baidu.com"]];
    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"=====%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }] resume] ;

打開 instruments 不會(huì)造成內(nèi)存泄漏

  1. 設(shè)置屬性
@property (nonatomic, strong) NSURLSession *session;

也不會(huì)造成內(nèi)存泄漏
4.結(jié)論

Snip20170928_5.png

通過NSURLSession的頭文件我們發(fā)現(xiàn),NSURLSession對(duì)于它的 delegate屬性是強(qiáng)引用。這就意味著當(dāng)session存在時(shí),其delegate就不會(huì)被釋放。另外,由session發(fā)起請(qǐng)求的緩存相關(guān)對(duì)象也會(huì)被其強(qiáng)引用并一直保留在內(nèi)存中。

所以為了避免內(nèi)存泄漏,根據(jù)Apple文檔,當(dāng)一個(gè)session不再使用時(shí),我們應(yīng)該調(diào)用finishTasksAndInvalidate或者invalidateAndCancel把session顯式地置為無效(invalidated),以釋放對(duì)相關(guān)對(duì)象的引用。

http://weibo.com/3321824014/E7SIdd0uD?filter=hot&root_comment_id=0&type=comment#_rnd1506581955467

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 內(nèi)存管理 簡述OC中內(nèi)存管理機(jī)制。與retain配對(duì)使用的方法是dealloc還是release,為什么?需要與a...
    丶逐漸閱讀 2,081評(píng)論 1 16
  • Github : Jerry4me, Demo : JRBgSessionDemo 前言 本文主要是結(jié)合官方文檔,...
    Jerry4me閱讀 12,049評(píng)論 11 53
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,626評(píng)論 30 472
  • 在WWDC 2013中,Apple的團(tuán)隊(duì)對(duì)NSURLConnection進(jìn)行了重構(gòu),并推出了NSURLSessio...
    lxl125z閱讀 2,590評(píng)論 0 1
  • 前言 內(nèi)存泄露是一個(gè)相對(duì)挺嚴(yán)重的問題,可是它的存在未引起足夠的重視,如果程序運(yùn)行時(shí)一直分配內(nèi)存而不及時(shí)釋放無用的內(nèi)...
    進(jìn)無盡閱讀 1,893評(píng)論 0 5

友情鏈接更多精彩內(nèi)容