我正在尝试在后台运行一个进程来生成一个字符串,然后在主线程中使用它(发送到远程服务器。)代码在模拟器中工作正常,并且字符串被记录两次预期。
在设备(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 :(得分: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];
});
});