簡體   English   中英

查找誰對 object 有保留計數

[英]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];
}

永遠不要直接依賴保留計數。 發生的情況是,在初始化過程中,有一段代碼retainautorelease 因為您不知道 object 被autorelease了多少次,所以您實際上不知道真正的保留計數是多少。

保留計數應僅用作調試輔助,而不應用作程序控制流。

只要您遵循 Cocoa 的Memory 管理編程指南中列出的所有規則,您就不會遇到問題。

找出誰將retainCount 增加到3 的最佳方法是什么?

那是從錯誤的角度解決問題。 會使您感到困惑,並導致您誤入歧途(並且可能正好過去)實際問題,而實際上確實存在問題。

最好想想誰擁有object。 您是否打算保留 object 作為您自己的財產之一的價值? 如果是這樣,那么您就是它的所有者之一。 如果不是,那么你不是。 如果您將 object 傳遞給另一個 object 以存儲在其中一個屬性中,那么另一個 object 也是所有者。

這些所有權只是關系,因此很容易將它們直接記在腦海中。

  • “這是我的一個控制器。 它擁有我的 model 的根對象和一個或多個視圖[控制器]。”
  • “這是一種觀點。 它擁有我的 model 的某些部分。”
  • “這是我的 model 的一部分。 它只擁有原始對象。”
  • “這是我的 model 的另一部分。 它擁有一些原始對象和 model 的其他一些位。”

如果您牢牢掌握了所有權,那么您不能編寫 memory 泄漏,除非忘記releaseautorelease消息(這可能發生在任何人身上),而且您幾乎肯定不會編寫循環保留(兩個對象相互保留)除非有意並帶有大量評論和#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM