NSURLSession的代理为什么使用retain?

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;

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值