繁体   English   中英

ASIHTTPRequest / ASIFormDataRequest-在ARC下的块内引用请求对象

[英]ASIHTTPRequest / ASIFormDataRequest - referencing request object within blocks under ARC

此问题非常相似,我正在尝试将使用ASIHTTPRequestASIFormDataRequest的项目转换为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM