讓我們看看這段代碼:當在另一個線程上執行塊時,我應該使用'volatile'和'__block'限定符嗎?
- (void)addOperationAndWait:(void (^)())operation {
__block NSException *exception = nil;
[self.queue addOperationWithBlock:^{
@try {
operation();
}
@catch (NSException *ex) {
exception = ex;
}
}];
[self.queue waitUntilAllOperationsAreFinished];
if (exception) {
@throw exception;
}
}
這些代碼行是在一個線程中執行:
exception = ex;
:
__block NSException *exception = nil;
if (exception) {
@throw exception;
}
,這行代碼是在另一個線程執行
所以我應該聲明exception
變量爲volatile
以確保該變量的值沒有被緩存b ❖使用它的線程?
我有一個疑問,因爲這片文檔的:
volatile變量應用另一類型的內存限制的個別變量。編譯器通常通過將變量的值加載到寄存器中來優化代碼。對於局部變量,這通常不是問題。如果變量從另一個線程可見,但是這樣的優化可能會阻止其他線程注意到它的任何更改。將volatile關鍵字應用於變量會強制編譯器在每次使用時從內存加載該變量。如果它的值可以在任何時候通過外部源被改變,編譯器可能無法檢測
我建議你找出爲什麼會拋出異常。 Objective-C規則是隻應拋出異常來指示編程錯誤。你不抓住它們,你修復代碼。 – gnasher729 2014-10-28 08:21:32
@ gnasher729感謝您的回覆。但異常並不是這裏最重要的事情。這只是一個明顯的例子。我有一些類似的情況是我的代碼,我不知道像這樣的代碼 - 沒有'volatile'限定符 - 是完全可靠的。 – wdmczk 2014-10-28 09:11:24