亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

帶有ARC的iOS應用,查找誰是對象的所有者

帶有ARC的iOS應用,查找誰是對象的所有者

iOS
慕少森 2019-10-11 10:14:46
我正在編寫一個使用ARC的應用程序,此刻似乎有一些內存泄漏。谷歌搜索我發現了一些有關如何使用檢查器的提示。在這里,我可以看到一些類實例的分配堆,也可以看到一些關于如何分配對象以及如何更改保留計數的調用堆棧。但是看來我看不到完整的調用堆棧,所以我不知道最終由誰擁有該對象。在我看來,此所有者以某種方式沒有釋放對象(或擁有可疑對象的對象)。有人可以提示我尋找分配對象的所有者嗎?還請注意,對象未標記為“泄漏”,而是已分配。在我看來,隨著新對象的不斷分配,這些對象似乎在泄漏。感謝您提供有關如何最好地進行和查找可疑泄漏的進一步幫助。
查看完整描述

1 回答

?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

  1. 關于誰“擁有”一個對象的學術問題,這就是維護strong該對象引用的人。

  2. 就發現應用程序中的泄漏而言,您可以在配置應用程序時使用Instruments中的“泄漏”工具(在Xcode的“產品”菜單上選擇“配置文件”)。

  3. 但是,如果它沒有出現在“泄漏”中,那么您似乎必須決定它是否是一個強參考周期(以前稱為保留周期),一些簡單的邏輯錯誤(例如,視圖控制器中的一些循環參考,緩存)大型對象等)或某些與Core Foundation相關的問題(除非您謹慎使用CFBridgingRelease()或,否則ARC不承擔所有權__bridge_transfer)。

  4. 在使用樂器查找分配來源方面,最有用的兩個技巧是:

用鼠標單擊拖動(在6之前的Xcode版本中,option執行此操作時必須按住鍵)以突出顯示時間軸的一部分,以標識要檢查的內容。您可能想要關注分配中的峰值之一。例如,我在分配中發現了一個障礙,并如此突出顯示了這(這是一個非常簡單的示例,其中我在中創建了一個巨大的數組viewDidLoad,但希望它能為您提供想法):

http://img1.sycdn.imooc.com//5d9fe6590001e76a20161096.jpg

當您按調用樹進行檢查時,選擇“隱藏系統庫”以專注于代碼通常很有用。如果您雙擊Instruments中的方法名稱(在我的示例中為viewDidLoad),則Instruments將向您顯示進行分配的代碼:

http://img1.sycdn.imooc.com//5d9fe65b0001ce8920161096.jpg

然后,您可以雙擊相關的方法列表,它將帶您精確地進行分配的代碼。


    • 當您按調用樹進行檢查時,選擇“隱藏系統庫”以專注于代碼通常很有用。如果您雙擊Instruments中的方法名稱(在我的示例中為viewDidLoad),則Instruments將向您顯示進行分配的代碼:

    • 用鼠標單擊拖動(在6之前的Xcode版本中,option執行此操作時必須按住鍵)以突出顯示時間軸的一部分,以標識要檢查的內容。您可能想要關注分配中的峰值之一。例如,我在分配中發現了一個障礙,并如此突出顯示了這(這是一個非常簡單的示例,其中我在中創建了一個巨大的數組viewDidLoad,但希望它能為您提供想法):

盡管這并不表明您發生了泄漏(即強引用周期或釋放失敗的位置),但是這種分析通??梢詭椭櫺孤ο蟮膶嵗恢?,這是第一個找出問題的步驟。


如果您真的必須弄清楚誰“擁有”一個對象(即該對象的強引用(或保留位置)發生在哪里),則Xcode 8具有新的對象圖功能。因此,調試應用程序,然后在調試欄中點擊“調試內存圖”圖標(下面用紅色圓圈圈出)。完成后,您可以在左側選擇一個對象,然后可以看到顯示該對象所有權聲明的對象圖:

http://img1.sycdn.imooc.com//5d9fe65f0001382420161096.jpg

上面說明了所選圖像在顯示時都具有強引用UIImageView,而且ViewController也維護著強引用。

在較早的Xcode版本中,對應用程序進行配置文件以通過Instruments運行它,然后選擇“記錄引用計數”選項。在Xcode 6中,它位于最右側面板的“記錄設置”選項卡上:

http://img1.sycdn.imooc.com//5d9fe66300017aba22641050.jpg

在Xcode 5和更早的版本中,您必須單擊

http://img1.sycdn.imooc.com//5d9fe669000183ff20161096.jpg

“分配”工具旁邊的“ 信息”按鈕才能看到此“記錄引用計數”選項:

http://img1.sycdn.imooc.com//5d9fe66d00018b9f05370443.jpg

無論如何,您都可以轉到“分配摘要”,深入一些未釋放的對象(通過在“分配”工具中查看和對象時單擊對象地址旁邊的右箭頭),然后您會看到如上所示,該對象的保留和釋放列表。但是,只有對應用程序進行性能分析之前選擇“記錄引用計數”時,才會捕獲此數據。

以這種方式來跟蹤保留計數需要花費一些時間,但是如果您絕對需要知道強引用的建立位置,則“記錄引用計數”選項可以為您提供幫助。


查看完整回答
反對 回復 2019-10-11
  • 1 回答
  • 0 關注
  • 753 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號