2013-09-26 27 views
3

每當用戶點擊主頁按鈕,而我的應用程序處於活動狀態,我收到以下異常。輕微警告 - 下面的示例例外是NSCFString。但是,發送此消息的對象的類型,從而導致異常是完全隨機的。它可以是NSDataOS_dispatch_queue_specific_queueNSInvalidArgument異常 - 隨機對象接收didEnterBackground

[__NSCFString didEnterBackground:]:無法識別的選擇發送到 實例0x155344c0 *終止應用程序由於未捕獲的異常 'NSInvalidArgumentException' 的,原因是:「 - [__ NSCFString didEnterBackground:]:無法識別的選擇發送到實例 0x155344c0

每次發生應用程序被拒絕活動,但收到消息的對象永遠不會相同。

我認爲這是某種內存問題,但是在追蹤時遇到問題。主要是因爲我的代碼中沒有任何東西直接發送/接收此消息,或者註冊爲接收UIApplicationWillResignActiveNotification。此外,我的appDelegate中沒有任何方法可用於applicationDidEnterBackground:application方法。

有沒有人見過這種類型的行爲?如果是這樣,調試的最佳方法是什麼?或者,也許另一種方式,什麼樣的對象會自動發送didEnterBackground消息,我明顯是管理不善?

回答

3

聽起來像你有一個殭屍。

殭屍是一個被釋放後被調用的對象。通常情況下,對象的內存地址將被用於另一個對象,因此該消息將轉到錯誤的對象。

您是否有代碼使用方法addObserver:selector:name:object:?註冊您的應用程序對象之一以用於「did enter background」通知(UIApplicationDidEnterBackgroundNotification)?並且該通知是否指定了「didEnterBackground:?」的選擇器

我的猜測是你正在註冊UIApplicationDidEnterBackgroundNotification通知,然後你正在指定的notificationObserver被釋放。那會導致你描述的確切行爲。

順便說一下,你可能想使用殭屍工具運行你的應用程序,或打開NSZombies環境變量來尋找殭屍。然後按主頁按鈕導致崩潰並查看Xcode /樂器告訴您的內容。

+0

感謝您的回覆。我的確有一個殭屍。但是,它是由第三方lib引起的。然後把我的頭靠在牆上一會兒,然後有一個絕妙的想法給開發者發郵件。現在都好。感謝您的迴應。 – natenash203

+0

你好@ natenash203,我知道這已經很長時間了,但是你還記得你的第三方庫如何糾正這個問題嗎? 看來我的lib是這樣做的一個客戶,但它是非常罕見的,我不知道如何重現它。 另外NSZombies沒有找到任何東西;( – SeikoTheWiz

+0

你好,不幸的是,不,這一切都在幕後。 – natenash203