1 回答

TA貢獻1765條經驗 獲得超5個贊
關于誰“擁有”一個對象的學術問題,這就是維護
strong
該對象引用的人。就發現應用程序中的泄漏而言,您可以在配置應用程序時使用Instruments中的“泄漏”工具(在Xcode的“產品”菜單上選擇“配置文件”)。
但是,如果它沒有出現在“泄漏”中,那么您似乎必須決定它是否是一個強參考周期(以前稱為保留周期),一些簡單的邏輯錯誤(例如,視圖控制器中的一些循環參考,緩存)大型對象等)或某些與Core Foundation相關的問題(除非您謹慎使用
CFBridgingRelease()
或,否則ARC不承擔所有權__bridge_transfer
)。在使用樂器查找分配來源方面,最有用的兩個技巧是:
用鼠標單擊拖動(在6之前的Xcode版本中,option執行此操作時必須按住鍵)以突出顯示時間軸的一部分,以標識要檢查的內容。您可能想要關注分配中的峰值之一。例如,我在分配中發現了一個障礙,并如此突出顯示了這(這是一個非常簡單的示例,其中我在中創建了一個巨大的數組viewDidLoad,但希望它能為您提供想法):
當您按調用樹進行檢查時,選擇“隱藏系統庫”以專注于代碼通常很有用。如果您雙擊Instruments中的方法名稱(在我的示例中為viewDidLoad
),則Instruments將向您顯示進行分配的代碼:
然后,您可以雙擊相關的方法列表,它將帶您精確地進行分配的代碼。
當您按調用樹進行檢查時,選擇“隱藏系統庫”以專注于代碼通常很有用。如果您雙擊Instruments中的方法名稱(在我的示例中為
viewDidLoad
),則Instruments將向您顯示進行分配的代碼:用鼠標單擊拖動(在6之前的Xcode版本中,option執行此操作時必須按住鍵)以突出顯示時間軸的一部分,以標識要檢查的內容。您可能想要關注分配中的峰值之一。例如,我在分配中發現了一個障礙,并如此突出顯示了這(這是一個非常簡單的示例,其中我在中創建了一個巨大的數組
viewDidLoad
,但希望它能為您提供想法):
盡管這并不表明您發生了泄漏(即強引用周期或釋放失敗的位置),但是這種分析通??梢詭椭櫺孤ο蟮膶嵗恢?,這是第一個找出問題的步驟。
如果您真的必須弄清楚誰“擁有”一個對象(即該對象的強引用(或保留位置)發生在哪里),則Xcode 8具有新的對象圖功能。因此,調試應用程序,然后在調試欄中點擊“調試內存圖”圖標(下面用紅色圓圈圈出)。完成后,您可以在左側選擇一個對象,然后可以看到顯示該對象所有權聲明的對象圖:
上面說明了所選圖像在顯示時都具有強引用UIImageView
,而且ViewController也維護著強引用。
在較早的Xcode版本中,對應用程序進行配置文件以通過Instruments運行它,然后選擇“記錄引用計數”選項。在Xcode 6中,它位于最右側面板的“記錄設置”選項卡上:
在Xcode 5和更早的版本中,您必須單擊
“分配”工具旁邊的“ 信息”按鈕才能看到此“記錄引用計數”選項:
無論如何,您都可以轉到“分配摘要”,深入一些未釋放的對象(通過在“分配”工具中查看和對象時單擊對象地址旁邊的右箭頭),然后您會看到如上所示,該對象的保留和釋放列表。但是,只有在對應用程序進行性能分析之前選擇“記錄引用計數”時,才會捕獲此數據。
以這種方式來跟蹤保留計數需要花費一些時間,但是如果您絕對需要知道強引用的建立位置,則“記錄引用計數”選項可以為您提供幫助。
- 1 回答
- 0 關注
- 753 瀏覽
添加回答
舉報