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

Iphone ASIHTTPRequest/ASIFormDataRequest-在ARC下的块内引用请求对象,iphone,objective-c,ios,asihttprequest,automatic-ref-counting,Iphone,Objective C,Ios,Asihttprequest,Automatic Ref Counting,非常类似于,我正在尝试将使用ASIHTTPRequest&ASIFormDataRequest的项目转换为ARC 在我的视图控制器类中,我经常在完成块中引用并使用请求对象的属性(查看响应代码、响应数据等): 转换为圆弧时,我收到警告: 在此块中强烈捕获“请求”可能会导致 保留周期 正确的方法是什么 另一个SO用户在前一个线程中指出,简单地添加\uu-weak可能会导致请求在块完成之前被释放,我相信这是正确的 如何在ARC下的完成/失败块中正确引用这些属性?如果您的目标是5.0之前的iOS版本,这

非常类似于,我正在尝试将使用
ASIHTTPRequest
&
ASIFormDataRequest
的项目转换为ARC

在我的视图控制器类中,我经常在完成块中引用并使用
请求
对象的属性(查看响应代码、响应数据等):

转换为圆弧时,我收到警告:

在此块中强烈捕获“请求”可能会导致 保留周期

正确的方法是什么

另一个SO用户在前一个线程中指出,简单地添加
\uu-weak
可能会导致请求在块完成之前被释放,我相信这是正确的


如何在ARC下的完成/失败块中正确引用这些属性?

如果您的目标是5.0之前的iOS版本,这些版本不包括
支持:

__unsafe_unretained __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
(我读了你对另一个问题的评论)

在使用
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=nil
当您准备好释放请求时,可能在完成块内,或者在
self.request
的父对象的清理方法内

更新:

如果您的目标是iOS 5之前的版本,那么共同点是:使用
\uuuuuuuuuuuunretained
而不是
\uuuuuuuuuweak
。这是正常的,因为查看
ASIHTTPRequest.m
,块在其
dealloc()
中是
nil
(即,它们不应该被执行)。虽然我还没有测试过,但请确保仍然在启用NSZombies的情况下进行测试

注意:


取消
ASIHTTPRequest
对象的唯一安全方法是调用其
cleardelegates和cancel
方法。当我刚刚使用普通的
cancel
one时,我被一些讨厌的bug咬了一口。

我发现这个答案很有帮助:


它说使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。由于某些原因,若从xcode启动,该应用程序将在模拟器和设备上启动,但若它是使用临时发行版(如TestFlight)安装的,它将在应用程序启动后立即崩溃。使用接受答案建议的方法代替!巴福,这个问题看起来像是链接的,因为我链接到了它。岩浆。。胡安是绝对正确的。此方法在ios5+上不起作用。它对我也有同样的影响,我来这里是想找到答案。我的临时版本突然崩溃,而调试版本却没有。这并不容易,但我找到了这行代码。在这种情况下,“请求”立即被释放,然后在尝试对其执行任何操作时导致错误访问。但仅在发布版本中,而不是在调试版本中。@badweasel当使用缺乏弱支持的iOS版本时,这非常适合回答op提出的问题,即“在ARC下的块内引用请求对象”。另一个答案使用了一个弱引用,旧版iOS版本不支持该引用。这是做这件事的方法。当然,您必须意识到,您不能依赖于花哨的弱机制,如果您不知道如何正确处理指针,您将遇到崩溃。很抱歉,这是你没有正确管理指针的错误,而不是我的答案的错误。向下投票是不合适的。如果您的目标是iOS 5之前的版本,该怎么办?如果您正在创建一组添加到NSOperationQueue的请求该怎么办?虽然我还没有尝试过,但是
NSOperationQueue
的``addOperation`上的文档说明队列保留/保留了对该操作的强引用。实际上,它应该与保留
self.request
属性相同。这也解决了我的问题。Juan在对另一个答案的评论中描述了我遇到的确切问题,它在调试中运行良好,但在特殊情况下崩溃,并在发布版本中崩溃。幸运的是,我在一天内找到了这个问题,而不是花了整个审批周期。
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)
    // ...