第二十三篇、使用NSURLSession时需要注意一个内存泄漏问题


如图1代码所示,初始化一个NSURLSession临时实例对象并由它发起一个网络请求。我们通过Instruments的Leaks工具会发现其存在内存泄漏和循环引用的地方,如图2所示。
通过NSURLSession的头文件我们发现,NSURLSession对于它的 delegate属性是强引用。这就意味着当session存在时,其delegate就不会被释放。另外,由session发起请求的缓存相关对象也会被其强引用并一直保留在内存中。
所以为了避免内存泄漏,根据Apple文档,当一个session不再使用时,我们应该调用finishTasksAndInvalidate或者invalidateAndCancel把session显式地置为无效(invalidated),以释放对相关对象的引用。
最后,在一个 App 生命周期内,我们通常会初始化并配置好一个 NSURLSession对象,然后由它统一发起请求,一般不会显式把该session 置为无效(会在持有该session的类的dealloc方法里去释放它),所以建议采用单例的方式来使用NSURLSession(我们可以看到AFNetwoking的官方Demo也是通过单例来使用 AFSessionManager),就不会出现上述内存泄漏问题。
参考:
1. Apple NSURLSession Class Reference O网页链接
2. Memory leak when using NSURLSession.downloadTaskWithURL O网页链接
3. NSURLSession memory leak O网页链接
第二十三篇、使用NSURLSession时需要注意一个内存泄漏问题的更多相关文章
- Python开发【第二十三篇】:持续更新中...
Python开发[第二十三篇]:持续更新中...
- MFC 关于new出一个新对话框时,退出对话框内存泄漏的问题解决
问题: 在进行点击按钮弹出对话框时,我是用了new来生成一个新的对话框,但是在新对话框关闭的时候,经过检查发现,新对话框存在内存泄漏问题. 原因: 因为使用了new,但是当时没有找到地方进行delet ...
- SpringBoot第二十三篇:安全性之Spring Security
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11350255.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 系统的安全 ...
- 第二十三篇:在SOUI中使用LUA脚本开发界面
像写网页一样做客户端界面可能是很多客户端开发的理想. 做好一个可以实现和用户交互的动态网页应该包含两个部分:使用html做网页的布局,使用脚本如vbscript,javascript做用户交互的逻辑. ...
- Python之路【第二十三篇】:Django 初探--Django的开发服务器及创建数据库(笔记)
Django 初探--Django的开发服务器及创建数据库(笔记) 1.Django的开发服务器 Django框架中包含一些轻量级的web应用服务器,开发web项目时不需再对其配置服务器,Django ...
- Python之路(第二十三篇) 面向对象初级:静态属性、静态方法、类方法
一.静态属性 静态属性相当于数据属性. 用@property语法糖装饰器将类的函数属性变成可以不用加括号直接的类似数据属性. 可以封装逻辑,让用户感觉是在调用一个普通的数据属性. 例子 class R ...
- Python之路【第二十三篇】爬虫
difference between urllib and urllib2 自己翻译的装逼必备 What is the difference between urllib and urllib2 mo ...
- 第二十三篇-ubuntu18.04怎么下载播放器以及如何设置默认播放器
下载播放器 安装命令:sudo apt-get install smplayer再安装解码器: 安装win32codecs包 如果是intel的CPU 代码: sudo apt-get install ...
- 【Python之路】第二十三篇--Django【进阶篇】
文件配置 1.模版Templates文件配置: TEMPLATE_DIRS = ( os.path.join(BASE_DIR,'templates'), ) 2.静态文件static配置: STAT ...
随机推荐
- ALM11 OTA API接口的问题
ALM11 在安装的时候好像不会自动加载OTA接口. 正常情况下, OTA的接口文件的路径为: C:\Program Files\Common Files\Mercury Interactive\Qu ...
- matlab inpolygon 判断点在多边形内
如何判断一个点在多边形内部? xv= [0 3 3 0 0]; %x坐标 yv= [0 0 3 3 0];%y坐标 x=1.5; y=1.5; in=inpolygon(x,y,xv,yv) plot ...
- vs2005升级到vs2010相关问题
1.项目编译失败,报 Resgen.exe 退出 ,错误代码2 处理方式: http://jingyan.baidu.com/article/90895e0fe80c6064ed6b0b6b.html ...
- DBHelper数据库操作类(二)
不错文章:http://www.codefans.net/articles/562.shtml http://www.cnblogs.com/gaobing/p/3878342.html using ...
- js防刷新的倒计时
近期在维护考试系统,在进行考试測试时无意中点击了刷新button.可是上面的倒计时并没有受到影响.同一时候在几篇博客中也有这种样例,所以我想看看它究竟是如何防止刷新的. 假设是用cs代码写.我们可能会 ...
- git 回退和删除操作
今天不小心把分支的commit提交到master上了.衰 主要通过下面几个命令解决了,很简单记录一下. git reset –hard 回退到某一个版本git push origin :xxxx ...
- Parse error: syntax error, unexpected T_PUBLIC in 问题解决
class 类中 public function _getInfo($sn){ $title = ''; $_array = explode('~', $sn); ...
- pomelo 服务器开发常用术语
gate服务器 一个应用的gate服务器,一般不参与rpc调用,也就是说其配置项里可以没有port字段,仅仅有clientPort字段,它的作用是做前端的负载均衡.客户端往往首先向gate服务器发出请 ...
- android122 zhihuibeijing 新闻中心NewsCenterPager加载网络数据实现
新闻中心NewsCenterPager.java package com.itheima.zhbj52.base.impl; import java.util.ArrayList; import an ...
- C#_IComparable实例 - 对象ID进行排序
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Comp ...