Grand Central Dispatch - 在线程之间传递数据

时间:2010-11-07 20:12:07

标签: objective-c grand-central-dispatch objective-c-blocks

我正在尝试在后台运行一个进程来生成一个字符串,然后在主线程中使用它(发送到远程服务器。)代码在模拟器中工作正常,并且字符串被记录两次预期。

在设备(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(),^ {});块。

希望这会帮助别人。

2 个答案:

答案 0 :(得分:3)

我错误地将代码简化为明确的问题。

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

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

希望这会帮助别人。

答案 1 :(得分:0)

我的猜测是NSString是一个自动释放对象,因此它将超出范围并在主队列代码块中使用之前释放。尝试将保留/释放添加到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];
 });

});