3

我正在尝试使用 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
}

有什么线索吗?

4

3 回答 3

7

您确定- (void)requestFinished:(ASIHTTPRequest *)request请求完成时您的实现类仍然存在吗?在我看来,这个类被释放得太早了。请注意,该delegate属性不保留其内容。

您可以添加一个[self retain]todoDownload和一个[self release]to - (void)requestFinished:(ASIHTTPRequest *)request,但要确保 (!)[self release]不会被太频繁地调用。如果请求永远不会完成,这也是可能的内存泄漏。最好将您的课程保留在其他地方。

您也可以尝试使用NSZombieEnabledset to进行调试YES以查找错误。

于 2010-01-29T20:48:19.877 回答
4

以下代码行似乎是错误的。

[request setDidFinishSelector:@selector(requestFinished)];

requestFinished方法有一个参数(ASIHTTPRequest *)。因此,当您设置如下选择器时,
您应该添加":" 。

[request setDidFinishSelector:@selector(requestFinished:)];
于 2010-01-29T21:08:09.143 回答
0

[请求响应字符串];

在此调用之前检查请求的retainCount。可能它等于零 :) 如果是这样 - 当您在doDownload方法中创建它时,您不应该忘记保留它。

于 2010-01-29T20:45:55.140 回答