【问题标题】:How to stop ASIHTTPRequest (using ARC) ?如何停止 ASIHTTPRequest(使用 ARC)?
【发布时间】:2011-11-03 17:23:00
【问题描述】:

我使用 ARC,对于 ASIHTTPRequest-Files,我有特殊的编译器链接器标志,因此它们不使用 ARC。现在我像这样创建一个 ASIHTTPRequest:

...

@property(nonatomic,strong) ASIFormDataRequest *request;

@syntesize 请求

...

self.request = [[ASIFormDataRequest alloc]initWithURL:[NSURL URLWithString:API3]];
self.request.delegate=self;
[self.request startAsynchronous];

如果视图在请求完成之前关闭,我会得到一个 EXEC_BAD_ACCESS,因为视图已经被释放。如果我打电话给一个

[self.request clearDelegateAndCancel]

请求没有停止,应用程序仍然继续崩溃。 我尝试在主线程上调用 clearDelegateAndCancel 并使用 performSelector afterDelay,但结果相同。 当我启用 ASIHTTPRequest 的 LOG 输出时,我看到方法被调用,并且 ASIHTTPRequest.m 中的内部函数 [self cancel] 被调用,但请求没有停止,我看到它是因为网络活动指示器.

有没有其他人有这个问题,或者知道如何解决?

【问题讨论】:

    标签: ios ios4 ios5 asihttprequest


    【解决方案1】:

    这可能是因为您的视图控制器,即 ASI 委托,没有被 ASI 作为弧弱指针管理,因此当视图控制器被释放时不会自动更新为 nil。 你应该在你的 arc viewcontroller 中实现 dealloc,以防止 ASI 回调不存在的委托(viewcontroller)

    - (void)dealloc
    {
       [request clearDelegatesAndCancel];
    }
    

    即使 viewDidUnload 也应该取消 ASI 请求归零,因此委托

    - (void)viewDidUnload
    {
        [self.request clearDelegatesAndCancel];
        self.request = nil;
    
        [super viewDidUnload];
    }
    

    【讨论】:

      【解决方案2】:

      您可以为该类禁用 ARC

      当您迁移项目以使用 ARC 时,-fobjc-arc 编译器标志设置为所有 Objective-C 源文件的默认值。您可以为特定类禁用 ARC,使用该类的 -fno-objc-arc 编译器标志。

      在 Xcode 中,转到目标 Build Phases tab > 打开 Compile Sources group 以显示源文件列表 > 双击要为其设置标志的文件 > 输入 -fno-objc-arc 在弹出面板中,然后点击完成。

      【讨论】:

        猜你喜欢
        • 2012-01-31
        • 1970-01-01
        • 2016-11-12
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 2011-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多