1

在ARC之前的時代,我可以覆蓋保留和釋放並記錄堆棧跟蹤 - 然後輕鬆找到保留我的對象的位置,而不應該。在沒有儀器的情況下在ARC中調試循環保留

現在禁止這樣做,有時運行的儀器不是一個選項(例如,只要我嘗試在設備上運行我的應用程序,並且該錯誤不會在模擬器中重現,它就會崩潰)。

任何建議如何在沒有樂器的情況下在ARC中完成此操作?

回答

2

我可能沒有最終答案,但我會分享一個技巧,我決定嘗試哪一步是正確的方向。

使用ARC時,編譯器不會允許您詢問retainCount,它甚至足以讓您停止執行performSelector:@selector(retainCount)。然而,我並沒有放棄,而是更進一步去獲得這個有用的調試指標。

[anInstance performSelector:NSSelectorFromString(@"retainCount")]; 

這樣就會越過編譯器,並且會在後臺顯示更多內容。這不是堆棧,但是通過大量記錄這個值,你可以得到一些提示。

我可能會放棄它,但我正在玩一個更棘手的技術(閱讀:醜陋)來獲取堆棧。基本思想是通過class_addMethod()或method_setImplementation通過objective-c運行時「擴展」retain方法。我會給出公正的警告,目前爲止我沒有希望能夠得到它的工作,而且我很快就會回到上述performSelector調用的更頻繁的日誌。

祝你好運!

編輯自從我寫這個,我已經發現的核心基礎功能:

NSLog("RetainCount: %ld", (CFGetRetainCount((__bridge CFTypeRef) anInstance)); 

這可能不是在所有箱子工作,但最多的,肯定的。見The documentation

+0

我想這是你現在可以做的最好的... 我最終發現了爲什麼儀器崩潰並將其用於原始問題 – yonix 2012-07-10 09:05:34

+0

很酷。我還在關於CFGetRetainCount的答案中添加了一個註釋,我最近才發現它。 – 2012-07-10 13:08:53

0

您是否嘗試過設置Exception斷點? 斷點面板,左下角的「+」,「添加異常斷點...」,「完成」 如果您可以將異常隔離到一行,則應該能夠確定哪個對象行爲異常。希望這可以幫助:)

+0

有沒有例外,這是一個邏輯錯誤,因爲一個對象應該被釋放,但仍然活着。 – yonix 2012-03-13 16:24:39

相關問題