NSOperation 中的块
我使用 AFNetworking 执行 URL 请求并在 NSOperation 中定义成功/错误块 - 所以这基本上是在 NSOperation 中运行异步进程。
我理解这种方法背后的警告,因为 NSOperation 会在调用委托方法之前提前终止,因此通过在主线程上运行 start() 来实现建议的解决方案之一(相关帖子 NSOperation 中的异步方法)。
到目前为止,一切都很好,我可以看到执行顺序是正确的,即成功块执行,完成,然后调用 dealloc。直到有一个名为 __destroy_helper_block 的(系统?)线程引用 NSOperation 中的成功块,该块在此阶段已被释放。这到底是什么? AFNetworking 是否持有对该块的引用?
该线程上的调用堆栈是:
objc_release
_destroy_helper_block
_区块_释放
__destroy_helper_block
_区块_释放
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];
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我只知道使用 ASINetworkQueue 可以轻松完成此操作:
I only know this is easily done with the ASINetworkQueue: