2014-09-29 56 views
-1

有時候,我看到在我的iOS應用程序崩潰,在這條線:手柄突變而列舉崩潰

NSNumber *index = [[self.objectByIndex allKeysForObject:obj] lastObject]; 

的崩潰是「所列舉的,而突變」。

包含上面的代碼行的方法常常被稱爲...

什麼是解決這個問題的最好方法是什麼?我應該把這行放在@synchronize塊嗎?

+2

您首先需要找出哪些代碼正在修改'objectByIndex',以便您也可以鎖定它。 (我傾向於更喜歡明確的鎖和隊列,因爲如果你在同一個類中使用'@ synchronized'的第二個理由,事情就會變得混亂。) – 2014-09-29 12:19:30

+0

這意味着你正在枚舉一個對象(例如'for NSNumber * x在someArray)')和其他地方你是「變異」的對象 - 添加或刪除元素。不要這樣做。這可能是由於多線程導致的,在這種情況下,您需要長時間思考您的設計。但通常它是在一個線程中執行此操作的代碼。 – 2014-09-29 12:47:40

+0

當你報告SO上的崩潰時,你必須**總是引用* entire *和* exact *錯誤信息。 – 2014-09-29 12:49:06

回答

1

這意味着您的obj正在枚舉,而您正在嘗試訪問它。將obj的內容複製到newobj中,並從中檢索出NSNumber

+0

我會給這個鏡頭 – user1028028 2014-09-29 12:56:10

0

看起來像你有一個競爭條件。另一個線程正在修改你的obj,當它被喚醒時從allKeys中找到lastObject。因此,您必須重新設計您的代碼以實現多線程安全。

btw如果經常調用此代碼,可能最好使用數組而不是字典,因爲您可以更快速地檢索數組的最後一個對象,然後使用字典。