NSURLSession强引用问题

    NSURLSession是iOS7引入的新特性,用以取代NSURLConnection,它的大体结构如下图:

wKiom1aPDK_zSCrSAAObbyKH-nE494.png

但是,NSURLSession与NSURLConnection有一点是相同的,那就是它们的delegate都是进行的强引用,如下:

NSURLSession:

wKioL1aPDebTi9_pAACdw0sFzp4814.pngNSURLConnection:

wKioL1aPDgmyB68ZAAD2W7d-EJE955.png

这样一来,如果不注意,就在使用过程中造成Retain Cycle(循环引用)。例如,有个类定义如下:

在.h文件里,类NetHTTPSession强引用NSURLSession。

wKiom1aPDm2C83kaAAHmKi28oZo927.png

在.m文件中初始化NSURLSession实例的时候又将本身作为session的delegate传入。这样就造成了潜在的Retain Cycle问题。

wKioL1aPDpeD-kDIAABPmznqXsU191.png

这个问题的解决方法是受网上一篇博客的启发:

wKioL1aPD6ijl0R7AAK6fe1k8Vo789.png

原文链接:http://blog.csdn.net/majiakun1/article/details/38133433

也就是说,在不想使用链接或任务结束的时候,要把session关闭。

具体做法如下:

(1)在数据通信、下载、上传完成后要释放session,并赋值为nil。

(2)在dealloc函数里将session释放,并赋值为nil。如:

wKiom1aPP6WjnuH9AABQUe_GPn4848.png



参考:

1、http://blog.csdn.net/majiakun1/article/details/38133433

2、http://blog.csdn.net/u013087513/article/details/49536503


你可能感兴趣的:(循环引用,NSURLSession)