[英]Finding who has a retain count to an object
我有一個 UIViewController 在我實例化它的那一刻,它的 retainCount 為 3。 這讓我覺得非常不正確。 找出誰將retainCount 增加到3 的最佳方法是什么? 我想實例化 object 應該給指針 1,然后我想也許將它推到 UINavigationController 的堆棧上可能會增加一個(雖然不確定?),但第三個......是一個謎。
亞當是對的,你不應該過度關注保留計數。
但是,如果您確實需要解決這樣的謎題,那么一個好的技術就是將受影響的 class 子類化,這樣您就可以將覆蓋添加到內存管理方法中。
例如,在 UIViewController 的子類中,您可以實現:
- (id) retain
{
// Break here to see who is retaining me.
return [super retain];
}
永遠不要直接依賴保留計數。 發生的情況是,在初始化過程中,有一段代碼retain
了autorelease
。 因為您不知道 object 被autorelease
了多少次,所以您實際上不知道真正的保留計數是多少。
保留計數應僅用作調試輔助,而不應用作程序控制流。
只要您遵循 Cocoa 的Memory 管理編程指南中列出的所有規則,您就不會遇到問題。
找出誰將retainCount 增加到3 的最佳方法是什么?
那是從錯誤的角度解決問題。 這會使您感到困惑,並會導致您誤入歧途(並且可能正好過去)實際問題,而實際上確實存在問題。
最好想想誰擁有object。 您是否打算保留 object 作為您自己的財產之一的價值? 如果是這樣,那么您就是它的所有者之一。 如果不是,那么你不是。 如果您將 object 傳遞給另一個 object 以存儲在其中一個屬性中,那么另一個 object 也是所有者。
這些所有權只是關系,因此很容易將它們直接記在腦海中。
如果您牢牢掌握了所有權,那么您不能編寫 memory 泄漏,除非忘記release
或autorelease
消息(這可能發生在任何人身上),而且您幾乎肯定不會編寫循環保留(兩個對象相互保留)除非有意並帶有大量評論和#warnings。
如果您還沒有弄清楚您的所有權,那么您可能已經編寫了一個或多個您不知道的 memory 泄漏或循環保留。
編輯:為了回答實際問題,找出 object 的保留內容以及可能隨后自動發布的內容的最佳方法是使用 Instruments 的 Allocations instrument 。 有了它,您可以查看任何 object 的歷史記錄,以查看其地址的每次分配、保留、自動釋放、釋放和釋放。
這不是 100% 的解決方案,但 LLVM Clang Static Analyzer 可以幫助追蹤不正確的手動 memory 管理使用情況。 在 Static 分析器和 MallocDebug 之間,您可以很快成為跟蹤 memory 管理問題的專家。 順便說一句,盡管 Instruments 是新的熱點,但我發現 MallocDebug 更可靠。
您可以在此處找到 LLVM Clang Static 分析器: LLVM/Clang Static 分析器
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.