1

我正在尝试在后台运行一个进程以生成一个字符串,然后在主线程中使用该字符串(发送到远程服务器)。代码在模拟器中运行良好,并且字符串按预期记录了两次。

在设备(iPad、4.2 和各种 iPhone)上,每次使用 EXC_BAD_ACCESS 都会崩溃。似乎 myString 超出了范围,但这似乎与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(), ^{}); 堵塞。

希望这会对其他人有所帮助。

4

2 回答 2

3

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

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

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

希望这会对其他人有所帮助。

于 2010-11-07T20:54:22.157 回答
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];
 });

});
于 2010-11-07T20:23:06.403 回答