ASIHTTPRequest Асинхронный сбой при изменении представления - PullRequest
0 голосов
/ 10 июня 2011

Я использую ASIHttpRequest для получения данных из XML-файла.Однако во время асинхронного запроса, как только я изменяю представление (обратно к предыдущему представлению с помощью контроллера навигации), происходит сбой приложения с EXC_BAD_ACCESS на main.m

Это происходит только во время выполнения запроса.

Ниже мой код:

-(void)ProcessXML{

    //Set url from string to url
    NSURL *theurl = [NSURL URLWithString:@"http://twitter.com/statuses/user_timeline/2smssupport.xml"];

    asirequest = [ASIHTTPRequest requestWithURL:theurl];
    [asirequest setDelegate:self];
    [asirequest startAsynchronous];

}


- (void)requestFinished:(ASIHTTPRequest *)request
{


    NSLog(@"Saving to Defaults");
    NSData *responseData = [request responseData];
    xmlSaved = responseData;

    prefs = [NSUserDefaults standardUserDefaults];
    [prefs setObject:responseData forKey:@"xmlDownload"];
    rssParser = [[RssParser alloc] loadXMLbyURL:xmlSaved];
    [self.tableView reloadData];
    NSLog(@"%@",[prefs dataForKey:@"xmlDownload"]);

}

Метод Process XML инициирует запрос, а затем полученные данные обрабатываются в RequestFinished.

Должно быть что-то, что я 'Мне не хватает ASIHTTPRequest, но я не знаю, что это такое?

Спасибо

Ответы [ 5 ]

3 голосов
/ 21 ноября 2011

Этот блок кода должен это исправить:

    -(void) viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        [request clearDelegatesAndCancel]
     }
1 голос
/ 10 июня 2011

Если представление освобождается, то делегат, который вы указали в запросе, теперь недействителен.Убедитесь, что вы установили для делегата значение nil в представлении dealloc, а также остановите запрос.

0 голосов
/ 10 июня 2011

NSZombieEnabled вам очень помогает. Вы можете сказать, какой объект вызывает EXC_BAD_ACCESS.

0 голосов
/ 10 июня 2011

Объект asirequest нигде не сохраняется, поэтому он освобождается после возврата ProcessXML.

0 голосов
/ 10 июня 2011

Вы освобождаете объект ASIHTTPRequest, когда выходите из текущего представления?Я предполагаю, что методы делегата вызываются после того, как ваш контроллер представления был освобожден.

-

@ Саймон прав, что вам нужно установить делегат равным nil.Я бы сделал следующее:

  1. Создайте свойство ASIHTTPRequest в своем классе и установите это свойство в своем методе ProcessXML.Это упрощает управление памятью и гарантирует, что объект запроса будет оставаться там, где он вам нужен.
  2. В обоих методах dealloc и requestFinished установите делегат запроса равным nil и установите self.request = nil;

По крайней мере, вы должны установить делегат равным nil в вашем методе requestFinished, но вы должны помнить, чтобы остановить выполнение вашего запроса, если вы отойдете от этого контроллера представления до его возврата,следовательно, в методе dealloc также устанавливается значение nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...