在ARC之前的時代,我可以覆蓋保留和釋放並記錄堆棧跟蹤 - 然後輕鬆找到保留我的對象的位置,而不應該。在沒有儀器的情況下在ARC中調試循環保留
現在禁止這樣做,有時運行的儀器不是一個選項(例如,只要我嘗試在設備上運行我的應用程序,並且該錯誤不會在模擬器中重現,它就會崩潰)。
任何建議如何在沒有樂器的情況下在ARC中完成此操作?
在ARC之前的時代,我可以覆蓋保留和釋放並記錄堆棧跟蹤 - 然後輕鬆找到保留我的對象的位置,而不應該。在沒有儀器的情況下在ARC中調試循環保留
現在禁止這樣做,有時運行的儀器不是一個選項(例如,只要我嘗試在設備上運行我的應用程序,並且該錯誤不會在模擬器中重現,它就會崩潰)。
任何建議如何在沒有樂器的情況下在ARC中完成此操作?
我可能沒有最終答案,但我會分享一個技巧,我決定嘗試哪一步是正確的方向。
使用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。
您是否嘗試過設置Exception斷點? 斷點面板,左下角的「+」,「添加異常斷點...」,「完成」 如果您可以將異常隔離到一行,則應該能夠確定哪個對象行爲異常。希望這可以幫助:)
有沒有例外,這是一個邏輯錯誤,因爲一個對象應該被釋放,但仍然活着。 – yonix 2012-03-13 16:24:39
我想這是你現在可以做的最好的... 我最終發現了爲什麼儀器崩潰並將其用於原始問題 – yonix 2012-07-10 09:05:34
很酷。我還在關於CFGetRetainCount的答案中添加了一個註釋,我最近才發現它。 – 2012-07-10 13:08:53