博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第二十三篇、使用NSURLSession时需要注意一个内存泄漏问题
阅读量:6245 次
发布时间:2019-06-22

本文共 733 字,大约阅读时间需要 2 分钟。


如图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 
2. Memory leak when using NSURLSession.downloadTaskWithURL 
3. NSURLSession memory leak 

 

转载于:https://www.cnblogs.com/HJQ2016/p/5866498.html

你可能感兴趣的文章
中小企业客户营收增长将成微博2016年主推动力
查看>>
第一个掘金文章
查看>>
我的友情链接
查看>>
微信Windows版无法备份聊天记录
查看>>
Github上传代码菜鸟超详细教程
查看>>
资金项目性能优化
查看>>
Java将图片处理成背景透明的圆形图片
查看>>
知道IP地址怎么查看mac地址
查看>>
2016年度总结
查看>>
对于常见未得到支持操作的理解
查看>>
Win7 下Maple驱动问题解决方案
查看>>
hibernate 不输出sql参数的解决
查看>>
Netty的异步事件驱动(ChannelFuture)
查看>>
PostgreSQL数据类型-货币类型
查看>>
eclipse.ini、flashbuilder.ini内存设置和堆栈非堆栈问题
查看>>
线程下变量-原子操作 __sync_fetch_and_add等等
查看>>
Java 远程调试
查看>>
android 一个小例子说明handler和AlertDialog的简单使用
查看>>
解密Redis持久化
查看>>
[转载]使用 CTTeleyphonyCenter 截获来去电及短信消息
查看>>