NSURLSession
NSURLSessin何许人也?它是iOS7引入的新的网络接口,此处不赘述如何使用,今天要说的是它的一个重要的属性:delegate;
@property (readonly, retain) id <NSURLSessionDelegate> delegate;
熟悉其他代理的同学可能发现了,通常来说,为了防止循环引用,代理都会使用weak或者assign参数,为何此处代理使用retain?苹果究竟是如何考虑?
说这个之前先看一下session的构造方法:
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(id <NSURLSessionDelegate>)delegate delegateQueue:(NSOperationQueue *)queue;
调用这个方法的同时会初始化一个NSURLSession对象,并为其设置代理。关于代理,官方文档中有如下描述:
The session object keeps a strong reference to the delegate until your app explicitly invalidates the session. If you do not invalidate the session by calling the invalidateAndCancel or resetWithCompletionHandler: method, your app leaks memory.
大概翻译:session对象会对代理进行强引用,除非调用
invalidateAndCancel、resetWithCompletionHandler:方法来销毁session对象,如果不这么做,应用会产生内存泄漏。
我在刚看到的时候也有点疑惑,后来经过思考,慢慢想清楚一些,如果此处session不对代理进行强引用,假设:
有一控制器A,在控制器A push 控制器B,控制器B开始下载任务,此时如果点击后退,那么正常情况下控制器B销毁,B中的代理方法也理所当然的无法执行,session对控制器的强引用也就是为了能够正常的进行后台下载的操作。
当然,如果希望在下载完成后正常释放控制器,那么就需要在完成下在的方法中:
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
调用invalidateAndCancel即可
- (void)invalidateAndCancel;
以上仅仅是个人思考的结果,如果有错误的地方,还希望您指出!