我得到了一个带SIGSEGV的iPhone崩溃报告,我想我已经缩小了可能的原因和解决方案。 由于线程造成的崩溃很难调试,我不能重复这个问题,但可以用我的假设一些帮助 - 这听起来吗?Objective-C线程安全代码以防止崩溃
我的代码使用ASIHttpRequest使用ASINetWorkQueue下载一组文件。下面是一个简化的样品
//initialize download queue and do this code block in a loop for each file
NSURL *fileURL = [NSURL URLWithString:...
__block ASIHTTPRequest *fileRequest = [ASIHTTPRequest requestWithURL:fileURL];
[fileRequest setCompletionBlock:^{
//do some stuff
}];
[fileRequest setFailedBlock:^{
NSString *someError = [NSString stringWithFormat:...
[self someErrorMethod:someError];
}];
[downloadQueue addOperation:...
-(void)someErrorMethod(NSString *errorMessage) {
DDLogWarn(errorMessage);
if ([self downloadQueue]) {
for (ASIHTTPRequest *request in [[self downloadQueue] operations]) {
[request clearDelegatesAndCancel];
}
[[self downloadQueue] reset];
}
}
顶部2行碰撞报告的是
- libobjc.A.dylib 0x31846fbc objc_msgSend + 15
- MyApp的0x0002cab5 - [Myapp someErrorMethod:](MyApp.m :)
我为什么发生这种情况
- 一个文件下载失败,失败的块被称为
- 它经过的每个请求,并清除代表和取消它们,然后重置队列思维
- 但是,当它一直运行时,另一个文件下载失败并进入失败的块回调
- 但是,由于它现在已被取消,其失败的块已被释放
- 当代码试图登录该错误消息,它的内存已经被释放和不可预知的结果如下
这是否有道理?由于我对Objective-C很陌生,我的分析是正确的还是缺少明显的东西?
我想使用锁来使errorMethod线程安全,希望它能解决这个问题。这听起来像是基于上述代码的正确解决方案吗?
谢谢
不知道你的错误,但你可能想看看这个:http://stackoverflow.com/a/5023583/330494你应该使用blocksafeSelf来引用自己与伊娃尔块。 – 2012-02-20 16:35:04
谢谢巴洛 我在这里使用一个单一类,永远不会被释放,所以我不认为保留周期是一个问题,对不对? – suhail 2012-02-23 03:09:33