2012-10-15 27 views
4

我得到上iOS6的以下的異常(與CoreData一個應用程序):異常與insertObject:atIndex:上iOS6的

「2012年10月15日10:21:28.952 MyApp的[68650:C07] *終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因: '* - [__ NSArrayM insertObject:atIndex:]:對象不能是零' *第一擲調用堆棧: (0x28e6012 0x2659e7e 0x2899b6a 0x2899a20 0x1646941 0x1642c67 0x164f846 0x164f908 0x6c540 0x2057e83 0x28a5376 0x28a4e06 0x288ca82 0x288bf44 0x288be1b 0x33967e3 0x3396668 0x15a165c 0x13a22 0x2845) libC++ abi.dylib:terminate調用拋出異常「

這不會發生在iOS5上,所以iOS6上發生了一些我不明白的事情。 我在每一個我調用insertObject:atIndex的點上設置一個斷點:但是這些不會被調用 - 它必須是在這個libC++ abi.dylib中被調用並崩潰的東西。 有誰知道什麼可能是錯的?

謝謝

+1

錯誤是說你試圖添加一個對象到'nil'的NSArray中。您需要查看要添加到數組中的對象。假設您之前創建的對象不再在iOS 6中正確創建。如果您可以縮小它,也許發佈一些代碼可能會爲您提供更好的答案。 – mttrb

回答

15

的原因崩潰的是,您要插入的對象是nil。這意味着它沒有正確實例化。這反過來意味着你已經到了那個例外之前。

你可以發佈代碼alloc ed和init ialized你試圖插入的對象嗎?

爲了找到代碼中的相關行,請嘗試以下方法:轉到「例外」選項卡中的您的Xcode項目:

Exception tab

然後點擊「+」按鈕(在頁面底部)並選擇「Add Exception Breakppoint ...」。將所有設置保留爲默認值,然後單擊「完成」。

如果您重新運行您的項目,現在應該停止在引發異常之前的相關代碼行。然後,您可以向上移動調用堆棧,並從代碼中的哪個位置調用負責此行爲的庫函數。然後嘗試查看是否所有對象都在此時正確初始化。

+0

問題是,這不會發生在我自己的代碼中,所以我在每個insertObject設置一個斷點:AtIndex:call,但是這似乎發生在其他地方(可能在libC++ abi.dylib中) – LeonS

+0

謝謝,現在我發現我的代碼的不好的部分:)似乎我每天都會學到新的東西^^ – LeonS

17

這可能是因爲iOS5沒有爲這個錯誤拋出異常(並且應該有,但是現在iOS6拋出一個比稍後有不穩定行爲更好的事件),或者因爲你在iOS6中有一些不同的行爲,這會讓你的對象nil而它並不在iOS5中。

無論什麼原因,您可以在insertObject:atIndex:符號上添加一個符號斷點,以便在每次調用此方法時都會中斷它,無論它在應用程序中的哪個位置(在您自己的代碼中)。

  • 轉到「斷點導航器」視圖(加利福尼亞 - 6快捷方式)
  • 點擊「+」按鈕,添加一個象徵性的斷點 Add symbolic breakpoint
  • 將象徵性的斷點打破時打符號[NSArray insertObject:atIndex:] Edit Symbolic Breakpoint

因此,你可以看到,當這被稱爲與杉杉一個nil值t參數並將其解決問題。

您也可以添加一個異常斷點以在拋出異常時中斷,從而知道何時在代碼中發生異常。這是另一種讓您知道代碼的哪一部分(您自己或另一個)生成異常的方法。

Exception Breakpoint

一旦斷點被​​擊中,並在異常發生前的程序停止,您可以檢查調用堆棧導致什麼樣的自己的代碼部分來觸發此異常底。

+1

這太棒了。我不確定爲什麼有些例外會告訴你哪一行代碼觸發了錯誤,有些則沒有。這個異常斷點應該是標準的! –

+0

異常斷點正是我所需要的。 –