2010-11-07 68 views
1

我想在后台运行一个进程来生成一个字符串,然后在主线程中使用(发送到远程服务器)。代码在模拟器中工作正常,并且该字符串按预期记录了两次。大中央调度 - 线程之间传递数据

在设备(iPad,4.2和各种iPhone)上,每次使用EXC_BAD_ACCESS都会崩溃。看起来myString超出了范围,但是这似乎违背了使用相同原理的示例on Wikipedia

的代码如下:

dispatch_async(_queue, ^{ 

NSString *myString = [self generateString]; 
NSLog(@"1 String is %@", myString); 
dispatch_async(dispatch_get_main_queue(), ^{ 
    NSLog(@"2 String is %@", myString); 
}); 

}); 

有谁知道为什么会崩溃,并解决它的最好方法?


我犯了一个错误,简化我的代码以保持我的问题清晰。

在主队列中,我实际上会用另一个呼叫自我发送消息,这会导致访问不良。

解决方案是在我的异步队列中调用方法,并在方法内部将代码包装在dispatch_async(dispatch_get_main_queue(),^ {});块。

希望这会帮助别人。

+0

您的编辑指示听起来像是您修复了症状,而不是问题。块将始终保留复制时引用的所有对象,包括“self”。 – bbum 2010-11-07 21:26:45

回答

3

我犯了错误,简化我的代码,以保持我的问题清晰。

在主队列中,我实际上会用另一个呼叫自我发送消息,这会导致访问不良。

解决方案是在我的异步队列中调用方法,并在方法内部将代码包装在dispatch_async(dispatch_get_main_queue(),^ {});块。

希望这会帮助别人。

0

我的猜测是NSString是一个autorelease对象,所以它将在主队列代码块中使用之前超出范围并被释放。尝试添加保留/释放到NSString:

dispatch_async(_queue, ^{ 

NSString *myString = [self generateString]; 
[myString retain]; 
NSLog(@"1 String is %@", myString); 
dispatch_async(dispatch_get_main_queue(), ^{ 
    NSLog(@"2 String is %@", myString); 
    [myString release]; 
}); 

}); 
+3

好想法,但不正确。当由dispatch_async()复制块时,内部块将保留myString。那些保留和发布不应该是必要的。 – bbum 2010-11-07 20:23:56

+0

的确,我试过保留这个字符串 – 2010-11-07 20:25:33