Я использую AFNetworking для выполнения URL-запроса и определения блоков успеха / ошибок в NSOperation - так что это в основном работает асинхронный процесс в NSOperation.
Я понимаю оговорку, лежащую в основе этого подхода, поскольку NSOperation завершится преждевременно, прежде чем будут вызваны методы делегата, и поэтому реализовал одно из предложенных решений, запустив start () в главном потоке (соответствующий пост Асинхронные методы в NSOperation ).
Пока все хорошо, я вижу, что порядок выполнения правильный, то есть блок успеха выполняется, выполняется, затем вызывается dealloc. До этого есть (системный?) Поток с именем __destroy_helper_block, который ссылается на блок успеха в NSOperation, который на этом этапе был освобожден. Что именно это? AFNetworking хранит ссылку на блок?
Стек вызовов в этом потоке:
objc_release
_destroy_helper_block
_Block_release
__destroy_helper_block
_Block_release
start_wqthread
Код
- (void) start {
...
void (^successHandler)(NSURLRequest *, NSHTTPURLResponse*, NSXMLParser *) = ^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
URLRequestParserDelegate *parserDelegate = [[URLRequestParserDelegate alloc]initWithChildDelegate:self];
// child to handle connection success
[self handleSuccess:request response:response];
// parse xml response data
[XMLParser setDelegate:parserDelegate];
[XMLParser parse];
[parserDelegate release];
[self finish];
}; // EXC_BAD_ACCESS on this line (?)
AFXMLRequestOperation *op = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request
success:successHandler failure:nil];
[op start];
}