请求完成时ASIHTTPRequest,EXC_BAD_ACCESS

时间:2010-01-29 20:32:43

标签: iphone objective-c delegates selector asihttprequest

我正在尝试使用ASIHTTPRequest执行异步请求,但在请求完成时收到通知时会遇到一些问题。

-(void)doDownload{
    NSURL *url = [NSURL URLWithString:@"http://www.someurl.com/?"];
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    [request setPostValue:@"someValue" forKey:@"someField"];
    [request setRequestMethod:@"POST"];

    [request setDelegate:self];
    [request setDidFinishSelector:@selector(requestFinished)];
    [request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
    // Use when fetching text data
    NSString *responseString = [request responseString];

}

永远不会调用requestFinished。我在ASIHTTPRequest.m中遇到异常,-handleStreamCompleted:

if (fileError) {
    [self failWithError:fileError];
} else {
    [self requestFinished];   <----- this call fails
}

任何线索?

3 个答案:

答案 0 :(得分:7)

在请求完成后,您确定实现- (void)requestFinished:(ASIHTTPRequest *)request的类仍然存在吗?在我看来,这个课程得到了太早的解除分配。请注意,delegate属性不会保留其内容。

您可以将[self retain]添加到doDownload,将[self release]添加到- (void)requestFinished:(ASIHTTPRequest *)request,但要确保(!)[self release]也不会被调用经常。如果请求永远不会完成,这也可能是内存泄漏。最好将你的班级留在其他地方。

您也可以尝试调试,NSZombieEnabled设置为YES以查找错误。

答案 1 :(得分:4)

您的代码的下一行似乎是错误的。

[request setDidFinishSelector:@selector(requestFinished)];

requestFinished 方法有一个参数(ASIHTTPRequest *) 因此,当您按照以下方式设置选择器时,应添加“:”

[request setDidFinishSelector:@selector(requestFinished:)];

答案 2 :(得分:0)

[request responseString];

在此次通话前检查请求的retainCount。可能它等于零:)如果那样 - 你不应该忘记在 doDownload 方法中创建它时保留它。