NSURLSession的代理为什么使用retain?

NSURLSession

NSURLSessin何许人也?它是iOS7引入的新的网络接口,此处不赘述如何使用,今天要说的是它的一个重要的属性:delegate;

@property (readonly, retain) id  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;

以上仅仅是个人思考的结果,如果有错误的地方,还希望您指出!

你可能感兴趣的:(iOS)