2013-02-15 73 views
55

是否有可能跟蹤我的Objective-C對象的分配和釋放?例如,如果我有一個Book類,我想跟蹤Book類型的所有對象的分配和釋放。我可以跟蹤所有默認的SKD類,比如UIViewController,UIWindow,UIView,NSDictionary和所有這些,但我想跟蹤從我定義的類創建的對象。儀器分配跟蹤用戶定義類的對象的alloc和dealloc

回答

212

您可以使用Allocations工具來跟蹤對象的生命週期。如果使用「分配」模板,則將其配置爲記錄mallocfree事件。您可能希望通過在分配儀器設置開啓「記錄引用計數」複選框,將其配置爲記錄retainreleaseautorelease事件:

record reference counts checkbox

(您不能切換此同時儀器被記錄,它只要你選擇你的模板默認啓動)

更新Xcode的9:蘋果已經變得更加難以找到這些設置。現在您需要選擇Allocations樂器,然後從菜單欄中選擇File> Recording Options。

跑步結束後,你可以找到使用分配>屬性>對象摘要視圖,這對於詳細信息窗格中的默認設置(窗口的下半部分)你的對象:

Object Summary setting for Detail pane

如果你想看到你停止運行之前已被釋放的對象,您需要更改配置壽命從「創建&仍住」設置(默認)「所有對象創建」:

Allocation Lifespan setting

要查找特定類的對象,請首先在窗口工具欄右端的搜索字段中輸入類名。然後在列表視圖的類別列中找到類名稱,將鼠標懸停在列表視圖上,然後單擊其旁邊的箭頭。例如,我的應用程序有一個名爲Tile類,所以我尋找那個,然後單擊列表視圖旁邊Tile箭頭:

Searching

現在列表視圖中顯示的Tile每個實例。 (請注意,您必須輸入對象的實際類,而不是超類。輸入NSObject將只能找到由[NSObject alloc]創建的對象,而不是由[Tile alloc]創建的對象。)通過單擊可以查看任何特定實例的歷史記錄旁邊的箭頭,該實例的地址:

Getting detail

在一個對象的詳細視圖,我可以看到mallocfree事件和,因爲我打開「記錄的引用計數」,我也能看到retainreleaseautorelease消息及其對對象的保留計數的影響。如果我想看到任何這些事件的調用堆棧,我可以在窗口的右側打開擴展詳細信息面板:

extended detail of call stack

+0

這是一個真棒文章。交互式圖像+1。你用什麼應用程序來創建這些截圖? – gyurisc 2013-06-26 11:03:05

+8

我使用ScreenFlow來記錄屏幕並編輯每個視頻的長度和大小。然後我使用Photoshop將每個視頻轉換爲動畫GIF。 – 2013-06-26 16:03:37

+2

@robmayoff fabulas工作,像你這樣的人正在幫助ios社區學習越來越多。 – Alok 2013-08-01 07:13:34