ASIHTTPRequest, EXC_BAD_ACCESS, когда запрос завершен - PullRequest
3 голосов
/ 29 января 2010

Я пытаюсь выполнить асинхронный запрос с 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 ]

7 голосов
/ 29 января 2010

Вы уверены, что ваш класс, который реализует - (void)requestFinished:(ASIHTTPRequest *)request, все еще существует после завершения запроса? Мне кажется, что класс слишком рано освободили. Обратите внимание, что свойство delegate не сохраняет свое содержимое.

Вы можете добавить [self retain] к doDownload и [self release] к - (void)requestFinished:(ASIHTTPRequest *)request, но убедитесь (!), Что [self release] не вызывается слишком часто. Это также возможная утечка памяти, если запрос никогда не завершится. Было бы лучше сохранить ваш класс в другом месте.

Вы также можете попытаться отладить с NSZombieEnabled, установленным на YES, чтобы найти ошибку.

4 голосов
/ 30 января 2010

Следующая строка вашего кода кажется неправильной.

[request setDidFinishSelector:@selector(requestFinished)];

requestFinished метод имеет аргумент (ASIHTTPRequest *).
Поэтому вы должны добавить ":" , когда вы устанавливаете селектор следующим образом.

[request setDidFinishSelector:@selector(requestFinished:)];
0 голосов
/ 29 января 2010

[request responseString];

Проверьте retainCount запроса перед этим звонком. Вероятно, он равен нулю :) Если это - вы не должны забывать сохранить его при создании в методе doDownload .

...