iOS內(nèi)存分析-工具篇

之前APP占用太大內(nèi)存,查找i內(nèi)存泄露、內(nèi)存消耗過大

  1. 查找泄漏
    在xcode自帶兩種內(nèi)存泄漏查詢工具
    1> Analyze: 靜態(tài)分析工具 - 查 找: 可以通過 Product ->Analyze 菜單項啟動- 快捷鍵: CMD+shift +b
    Analyze主要分析以下四種問題:


    根據(jù)這個圖標查看內(nèi)存泄漏疑點.png
  1. 邏輯錯誤:訪問空指針或未初始化的變量等;
  2. 內(nèi)存管理錯誤:如內(nèi)存泄漏等;
  3. 聲明錯誤:從未使用過的變量;
  4. Api調(diào)用錯誤:未包含使用的庫和框架。
    1、Value stored to 'xxx' during its initialization is never read // 對象聲明之后根本就沒有使用 只有賦值

2、Value stored to 'xxx' is never read // 對象聲明之后根本就沒有使用 只有賦值

3、function call argument is an uninitialized value // 所調(diào)用的方法沒有初始化值

4、The 'viewWillAppear:' instance method in UIViewController subclass 'xxx' is missing a [super viewWillAppear:] call // 調(diào)用此類方法時需實現(xiàn)父類方法

5、Argument to 'NSMutableArray' method 'addObject:' cannot be nil // 被添加的對象不能為nil
這個工具會把錯誤進行分類,每個分類下可以查看到具體的代碼行。


image.png

常見問題舉例
1)Localizability Issue (Apple)


image.png

意思是:面向用戶的文本應(yīng)使用本地化的字符串宏。
我的項目中錯誤最多的就是這個,因為很多地方的字符串沒有做本地化處理或者宏定義。
解決辦法:

1、在項目中添加本地化。
2、或者在 Build Settings 里面搜索“l(fā)ocalizability”找到 Missing Localizability(缺少本地化) 設(shè)置為 NO,就會忽略這個問題。如下圖:


image.png

2)Core Foundation/Objective-C


image.png

image.png

意思是:我這里漏寫了 [super viewDidLoad];
解決辦法: 補上 [super viewDidLoad];

3)Logic error


image.png

image.png

意思是:這個對象從來沒有被讀取使用過。
解決辦法: 刪掉永遠不會被使用的對象聲明,或者查找問題是不是該使用但是沒有使用。
4)Memory error


image.png

image.png

“nil returned from a method that is expected to return a non-null value”
意思是:不能傳空卻有可能傳了空值。
解決辦法: 我這里是因為只寫了else if 的判斷卻沒有 else 的判斷,所以有一定幾率返回的cell是空的,把else if 改成 else 就好了。其他情景也類似,只要不該空的時候不傳空就行。
5)Memory (Core Foundation/Objective-C)


image.png

image.png

“Potential leak of an object stored into 'nextBuffer'”
意思是:nextBuffer這個對象存在內(nèi)存泄漏。
解決辦法: 檢查是否存在內(nèi)存泄漏的可能。
6)Dead store
image.png

image.png

“Value stored to 'replyString' during its initialization is never read”
意思是:這個對象從來沒有被讀取使用過。
解決辦法: 刪掉永遠不會被使用的對象聲明,或者查找問題是不是該使用但是沒有使用。

2 >Instruments: 動態(tài)分析工具- 查 找: Product ->Profile 菜單項啟動- 快捷鍵: CMD + i.- 簡 介:它有很多跟蹤模塊可以動態(tài)分析和跟蹤內(nèi)存, CPU 和文件系統(tǒng).


image.png

界面的介紹

在 instruments 中,雖然選擇了 Leaks 模板,但默認情況下也會添加 Allocations 模板.基本上凡是內(nèi)存分析都會使用 Allocations 模板, 它可以監(jiān)控內(nèi)存分布情況。

① 選中 Allocations 模板,(圖1區(qū)域),右邊的3區(qū)域會顯示隨著時間的變化內(nèi)存使用的折線圖,同時在4區(qū)域會顯示內(nèi)存使用的詳細信息,以及對象分配情況.

② 點擊 Leaks 模板(圖中2區(qū)域), 可以查看內(nèi)存泄露情況。如果在3區(qū)域有 紅X 出現(xiàn), 則有內(nèi)存泄露, 4區(qū)域則會顯示泄露的對象.

  1. 打用leaks進行監(jiān)測:

點擊泄露對象可以在(下圖)看到它們的內(nèi)存地址, 占用字節(jié), 所屬框架和響應(yīng)方法等信息.打開擴展視圖, 可以看到右邊的跟蹤堆棧信息


image.png

leaks進行監(jiān)測

  1. 監(jiān)測結(jié)果的分析:


    勾選Call Tree可以將其他的信息過濾直接看到我們代碼中內(nèi)存泄露的部分.png

這是關(guān)于查詢內(nèi)存泄露的部分的操作。至于怎么查看內(nèi)存消耗過多的部分其實是跟leaks的使用是類似的。

同樣在instrument面板上選中Allocations


xcode8新圖標.png

具體的操作跟leaks的操作類似,大致的可以得出具體是哪個地方內(nèi)存消耗過大,其次還有xcode8新出的debugMemoryGraph對內(nèi)存調(diào)試也很有幫助,再這里就不一一描述了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容