Как остановить ASIHTTPRequest (используя ARC)? - PullRequest
0 голосов
/ 03 ноября 2011

Я использую ARC, для ASIHTTPRequest-Files у меня есть специальный флаг компилятора, поэтому они не используют ARC.Теперь я создаю запрос ASIHTTP:1009 * ...

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

Если представление закрылось до завершения запроса, я получаю EXEC_BAD_ACCESS, потому что представление уже освобождено.Если я вызываю

[self.request clearDelegateAndCancel]

Запрос не остановился, и приложение по-прежнему продолжает падать.Я попытался вызвать clearDelegateAndCancel в основном потоке и с executeSelector afterDelay, но с теми же результатами.Когда я включаю вывод LOG для ASIHTTPRequest, я вижу, что вызваны методы, а также вызывается внутренняя функция [self cancel] в ASIHTTPRequest.m, но запрос не остановился, я вижу его из-за индикатора сетевой активности.

Кто-нибудь еще имеет эту проблему, или знаете, как решить?

Ответы [ 2 ]

2 голосов
/ 05 февраля 2012

Вы можете отключить ARC для этого одного класса

При переносе проекта для использования ARC флаг компилятора -fobjc-arc устанавливается по умолчанию для всех исходных файлов Objective-C. Вы можете отключить ARC для определенного класса, используя флаг компилятора -fno-objc-arc для этого класса.

В Xcode перейдите к цели Build Phases tab> откройте Compile Sources group, чтобы открыть список исходных файлов> дважды щелкните файл, для которого вы хотите установить флаг> введите -fno-objc-arc во всплывающей панели, затем нажмите Готово.

2 голосов
/ 03 декабря 2011

это, вероятно, потому, что ваш viewcontroller, то есть делегат ASI, не управляется ASI как слабый указатель дуги и поэтому автоматически не обновляется до нуля, когда viewcontroller освобождается. Вы должны реализовать dealloc в вашем контроллере представления дуги, чтобы не дать ASI вызвать обратный вызов несуществующего делегата (viewcontroller)

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

Even viewDidUnload должен отменить обнуление запроса ASI, поэтому делегат

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

    [super viewDidUnload];
}
...