[英]ASIHTTPRequest / ASIFormDataRequest - referencing request object within blocks under ARC
与此问题非常相似,我正在尝试将使用ASIHTTPRequest
和ASIFormDataRequest
的项目转换为ARC。
在我的视图控制器类中,我经常在完成块中引用和使用request
对象的属性(查看响应代码,响应数据等):
__block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:SOME_URL]];
[request setCompletionBlock:^{
if([request responseStatusCode] == 200) ....etc
转换为ARC时,出现警告:
在此区块中强烈捕获“请求”可能会导致保留周期
正确的方法是什么?
另一个SO用户在上一个线程中指出,仅添加__weak
可能会导致请求在块完成之前被释放,我相信这是事实。
如何在ARC下的完成/失败块中正确引用这些属性?
(我阅读了您对另一个问题的评论)
在使用ASIHTTPRequest
实现更多模块ASIHTTPRequest
,我了解到最好的方法是保持对请求对象的strong
引用。 就您而言,您可以执行以下操作:
self.request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:SOME_URL]];
__weak ASIFormDataRequest *weakRequest = self.request; // __block directive not needed since we only access the instance's properties.
[self.request setCompletionBlock:^{
if([weakRequest responseStatusCode] == 200)
// ...
这样,即使启动请求后,您仍然可以控制self.request
(例如,取消)。 你可以做self.request = nil;
当您准备好释放请求时,可能在您的完成块或self.request
的父对象的清除方法中。
更新:
如果您的目标是iOS 5之前的版本,那么通常的立场是:使用__unsafe_unretained
而不是__weak
。 这是可以的,因为看着ASIHTTPRequest.m
,块是nil
“编辑出其dealloc()
即他们不应该得到执行)。 尽管我还没有测试过,但是请确保仍启用NSZombies进行测试。
注意:
取消ASIHTTPRequest
对象的唯一安全方法是调用其clearDelegatesAndCancel
方法。 当我只使用普通的cancel
时,我就被一些讨厌的错误所咬。
如果您要定位5.0之前的iOS版本,则不包括weak
支持:
__unsafe_unretained __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
我发现此答案会有所帮助: https : //stackoverflow.com/a/7735770/133875
它说使用__unsafe_unretained
和__block
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.