之前APP占用太大內(nèi)存,查找i內(nèi)存泄露、內(nèi)存消耗過大
-
查找泄漏
在xcode自帶兩種內(nèi)存泄漏查詢工具
1> Analyze: 靜態(tài)分析工具 - 查 找: 可以通過 Product ->Analyze 菜單項啟動- 快捷鍵: CMD+shift +b
Analyze主要分析以下四種問題:
根據(jù)這個圖標查看內(nèi)存泄漏疑點.png
- 邏輯錯誤:訪問空指針或未初始化的變量等;
- 內(nèi)存管理錯誤:如內(nèi)存泄漏等;
- 聲明錯誤:從未使用過的變量;
- 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
這個工具會把錯誤進行分類,每個分類下可以查看到具體的代碼行。

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

意思是:面向用戶的文本應(yīng)使用本地化的字符串宏。
我的項目中錯誤最多的就是這個,因為很多地方的字符串沒有做本地化處理或者宏定義。
解決辦法:
1、在項目中添加本地化。
2、或者在 Build Settings 里面搜索“l(fā)ocalizability”找到 Missing Localizability(缺少本地化) 設(shè)置為 NO,就會忽略這個問題。如下圖:

2)Core Foundation/Objective-C


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


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


“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)


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


“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).

界面的介紹
在 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ū)域則會顯示泄露的對象.
- 打用leaks進行監(jiān)測:
點擊泄露對象可以在(下圖)看到它們的內(nèi)存地址, 占用字節(jié), 所屬框架和響應(yīng)方法等信息.打開擴展視圖, 可以看到右邊的跟蹤堆棧信息

leaks進行監(jiān)測
-
監(jiān)測結(jié)果的分析:
勾選Call Tree可以將其他的信息過濾直接看到我們代碼中內(nèi)存泄露的部分.png
這是關(guān)于查詢內(nèi)存泄露的部分的操作。至于怎么查看內(nèi)存消耗過多的部分其實是跟leaks的使用是類似的。
同樣在instrument面板上選中Allocations

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

