2010-11-07 65 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