Xcode工具解析
注:文參考apple官網(wǎng)Instruments User Guide
Page Not Found - Apple Developer
Analyze-xcode編輯和解析工具
iOS的分析工具可以發(fā)現(xiàn)編譯中的warning绸罗,內(nèi)存泄漏隱患谴咸,甚至還可以檢查出logic上的問(wèn)題偿枕;所以在自測(cè)階段一定要解決Analyze發(fā)現(xiàn)的問(wèn)題,可以避免出現(xiàn)嚴(yán)重的bug卵沉;
Analyze是靜態(tài)分析工具 可以通過(guò)菜單 Product→Analyze啟動(dòng)
內(nèi)存泄漏隱患提示:Potential Leak of an object allocated on line ……
數(shù)據(jù)賦值隱患提示:The left operand of …… is a garbage value;
對(duì)象引用隱患提示:Reference-Counted object is used after it is released;
App內(nèi)存問(wèn)題定位-Allocations
? ? ? ? ? ? ?管理內(nèi)存是app開(kāi)發(fā)中最重要的一個(gè)方面。不管是iOS手機(jī)還是mac OS 電腦,內(nèi)存都是緊缺資源硕并。對(duì)于很多開(kāi)發(fā)者來(lái)說(shuō)膊升,在程序架構(gòu)中減少內(nèi)存的使用通常都是使用Allocations Instrument去定位和找出減少內(nèi)存使用的方式怎炊,比如可能是改進(jìn)程序架構(gòu)和算法。但是廓译,再好的App設(shè)計(jì)都會(huì)被不同的內(nèi)存問(wèn)題困擾评肆。這一節(jié)就是講述 怎么樣使用工具去識(shí)別幾個(gè)通用的內(nèi)存問(wèn)題。
圖檢測(cè)到了App啟動(dòng)時(shí)的一個(gè)內(nèi)存消耗的各個(gè)進(jìn)程Category非区。根據(jù)這個(gè)開(kāi)發(fā)人員可以去改進(jìn)程序架構(gòu)和算法瓜挽。
Activity Monitor-內(nèi)存使用情況
關(guān)于Monitor有關(guān)小白簡(jiǎn)介送推薦看看-小白學(xué)習(xí)instrument之Activity Monitor - 簡(jiǎn)書(shū)
下面進(jìn)入進(jìn)階介紹:
Activity Monitor Trace Template 綜合統(tǒng)計(jì)了系統(tǒng)的活動(dòng),包括CPU征绸、memory久橙、disk 和 network。但是它僅僅包含了Activity Monitor管怠,你可以在Trace Template 中增加你想增加的工具淆衷。比如,后面你將會(huì)看到在iOS設(shè)備上可以在Activity Monitor 中可以觀察網(wǎng)絡(luò)活動(dòng)渤弛。Activity Monitor 工具捕獲加載在系統(tǒng)上的信息和虛擬內(nèi)存的大小進(jìn)行比較祝拯。它還可以記錄系統(tǒng)上一個(gè)或者多個(gè)程序的信息。它可以提供給你一個(gè)方便快捷的表格去觀察收集的信息暮芭, 下面是memory usage中兩個(gè)表格的詳細(xì)描述:
Real Memory Usage(bar graph):顯示使用內(nèi)存最多的五個(gè)
Real Memory Usage(pie chart): 顯示使用內(nèi)存最多的五個(gè)的內(nèi)存總量
這個(gè)記錄的設(shè)置面板的側(cè)邊欄的設(shè)置區(qū)域中包含了一系列的內(nèi)存統(tǒng)計(jì)鹿驼,是設(shè)置能夠通過(guò)計(jì)算一些數(shù)據(jù)顯示在記錄面板中欲低。選擇統(tǒng)計(jì)選項(xiàng)去查看具體的內(nèi)容。點(diǎn)擊圖形或者顏色去設(shè)置是否讓該項(xiàng)出現(xiàn)在記錄面板中畜晰。
這里有一系列Activity Monitor 工具支持的統(tǒng)計(jì)砾莱,下面這些是有關(guān)內(nèi)存的描述。
Physical Memory Wired
Physical Memory Active
Physical Memory Inactive
Physical Memory Used
Physical Memory Free
Total VM Size
VM Page In Bytes
VM Page Out Bytes
VM Swap Used
如果這些選項(xiàng)沒(méi)有出現(xiàn)在系統(tǒng)統(tǒng)計(jì)中凄鼻,就點(diǎn)擊下面的“Select statistics to list”腊瑟,然后點(diǎn)擊這些選項(xiàng)的復(fù)選框。
用Allocations Trace Template找出的Abandoned Memory內(nèi)存
你可以在App中用Allocations Trace Template找出系統(tǒng)Abandoned Memory(原文Abandoned Memory)块蚌。Abandoned Memory和內(nèi)存泄露不一樣闰非。內(nèi)存泄露是你先前分配的內(nèi)存但是長(zhǎng)時(shí)間沒(méi)有引用去引用它,換句話(huà)說(shuō)峭范,你沒(méi)有用任何的方式去釋放它财松。Abandoned Memory就是你分配的內(nèi)存由于一些原因不再使用。也許你的應(yīng)用程序包含一個(gè)你從來(lái)沒(méi)有完全實(shí)現(xiàn)功能的一些代碼纱控,或者你有一個(gè)錯(cuò)誤的代碼中添加圖片緩 存辆毡,但它們已經(jīng)被緩存了。這些內(nèi)存都會(huì)影響App的整體內(nèi)存占用甜害,你應(yīng)該解決這些問(wèn)題使得你的應(yīng)該程序更加高效舶掖。
因?yàn)楸籄bandoned Memory在技術(shù)上依然是有效的,但是不再有用尔店。Leaks Instrument沒(méi)有辦法去識(shí)別它們眨攘。因此,你必須執(zhí)行一些檢測(cè)的工作去定位這些問(wèn)題嚣州。Allocations Trace Template幫助App跟蹤堆內(nèi)存的分配和使用鲫售,很詳細(xì)的描述了每個(gè)類(lèi)的每個(gè)對(duì)象的內(nèi)存分配。它也能統(tǒng)計(jì)虛擬內(nèi)存的分配和使用記錄该肴。它包含了 Allocations和VM Tracker工具龟虎。如果是為了統(tǒng)計(jì)Abandoned Memory,就要使用Allocations工具沙庐。
用Allocations Template能保證在重復(fù)執(zhí)行一系列的操作的時(shí)候堆內(nèi)存不會(huì)繼續(xù)增加。例如佳吞,結(jié)束和開(kāi)始一個(gè)游戲拱雏,打開(kāi)和關(guān)閉一個(gè)窗口、設(shè)置和取消一個(gè)引用都是在概念 上相同的操作底扳,這樣讓你的App保持先前的內(nèi)存分配狀態(tài)铸抑。通過(guò)多次循環(huán)這樣的操作不會(huì)導(dǎo)致堆內(nèi)存的無(wú)限增長(zhǎng)。這種重復(fù)的分析過(guò)程叫做 “generational analysis”衷模∪笛矗“generation”代表在一段特定時(shí)間內(nèi)的一系列分配蒲赂。通過(guò)對(duì)多個(gè)“generation”動(dòng)作的重復(fù)操作,你可以分析結(jié)果刁憋, 觀察確定內(nèi)存分配的趨勢(shì)滥嘴。當(dāng)你發(fā)現(xiàn)了不正確的結(jié)果或者相矛盾的趨勢(shì),你可以研究是不是有Abandoned Memory至耻,然后你就可以改正它若皱。
1、打開(kāi)Allocations trace template
2.在工具條中選擇你的目標(biāo)app
3. 在側(cè)邊條中點(diǎn)擊顯示設(shè)置按鈕.
這可以讓你快速訪(fǎng)問(wèn)生成的標(biāo)記按鈕尘颓,使用它來(lái)為你的應(yīng)用標(biāo)記不同操作顯示的信息走触。
4. 在工具條中點(diǎn)擊紀(jì)錄按鈕去開(kāi)始記錄應(yīng)用
5.在App中執(zhí)行一系列的重復(fù)操作
為了準(zhǔn)確地生成的趨勢(shì)分析,這應(yīng)該是一組動(dòng)作的開(kāi)始和結(jié)束在相同的狀態(tài)疤苹。
6. 在每個(gè)重復(fù)動(dòng)作迭代完之后互广,點(diǎn)擊Mark Generation按鈕
在跟蹤面板中生成一個(gè)標(biāo)記去識(shí)別一個(gè)“generation”。
標(biāo)記的一系列“generation”都會(huì)在跟蹤面板中顯示卧土。每個(gè)“generation”都有一系列的內(nèi)存分配表惫皱。
7.重復(fù)第五歩和第六步幾次,直到你是否觀察到內(nèi)存無(wú)限增長(zhǎng)夸溶。然后點(diǎn)擊停止按鈕
這里 “generation”用作真正的分析逸吵。“generation”在你記錄開(kāi)始之后也能被標(biāo)記缝裁。在跟蹤面板的時(shí)間線(xiàn)上扫皱,簡(jiǎn)單的拖拽運(yùn)行的時(shí)間線(xiàn)到你想要的位置,然后在側(cè)邊欄中點(diǎn)擊Mark Generation捷绑。
8.在詳細(xì)的面板的中韩脑。點(diǎn)擊“generation”左邊的disclosure triangle按鈕來(lái)顯示“generation”包含的目標(biāo)。
9.查找App中仍然存在的分配的目標(biāo)粹污。選中一個(gè)段多,點(diǎn)擊它左邊的disclosure triangle按鈕來(lái)顯示它的Instance。
10.選擇其中一個(gè)Instance壮吩,在右邊的側(cè)邊欄中點(diǎn)擊Extended Detail去觀察分配stack trace进苍。
在stack trace中,你的代碼是很容易辨認(rèn)的鸭叙。因?yàn)樗呛谏木醢。懊嬗幸粋€(gè)用戶(hù)圖標(biāo)。為了使你的代碼更容易被找到沈贝,單擊collapse button 隱藏在stack trace上的系統(tǒng)調(diào)用代碼杠人。
11.在stack trace上雙擊進(jìn)入代碼顯示界面
點(diǎn)擊Xcode圖標(biāo)進(jìn)入Xcode界面顯示代碼。
12.評(píng)估你的代碼確定內(nèi)存分配是否正確。如果不正確嗡善,那說(shuō)明這個(gè)Abandoned Memory你應(yīng)該解決辑莫。
注意:除了幫助你識(shí)別被Abandoned Memory,generational analysis也可以用于定位內(nèi)存泄露和緩存的內(nèi)存泄漏罩引。如上所述各吨,泄漏的內(nèi)存(也可以用Leaks Instrument檢測(cè))是應(yīng)用程序沒(méi)有引用而且不能釋放或再次使用的內(nèi)存。高速緩存的內(nèi)存蜒程,是用于應(yīng)用程序再次使用以便獲得更好的性能的內(nèi)存绅你。
13.instrument 工具跟蹤應(yīng)用的內(nèi)存分配情況。
該 instrument 工具要 求你加載一個(gè)進(jìn)程,以便它能收集進(jìn)程開(kāi)始之后的數(shù)據(jù)昭躺。 該 instrument 工具捕獲以下信息:
類(lèi)別(Category)通常是一個(gè) Core Foundation 對(duì)象忌锯、Objective-C 類(lèi)、或原始 內(nèi)存塊(block)领炫。
凈分配字節(jié)數(shù)(Persistent Bytes):?????????????????????? 當(dāng)前已經(jīng)分配內(nèi)存但是仍然沒(méi)有被釋放的字節(jié)的總 數(shù)偶垮。
凈分配數(shù)(#Persistent):????????????????????????????????????? 當(dāng)前已經(jīng)分配內(nèi)存但仍然沒(méi)有被釋放的對(duì)象或內(nèi)存塊的數(shù)量。
臨時(shí)分配數(shù)(#Transient):??????????????????????????????????? 當(dāng)前已經(jīng)分配內(nèi)存但仍然沒(méi)有被釋放的對(duì)象或內(nèi)存塊的數(shù)量帝洪。
總分配字節(jié)數(shù)(Total Bytes):??????????????????????????????? 所有已經(jīng)分配內(nèi)存,而且包括已經(jīng)被釋放了的 字節(jié)的總數(shù)似舵。
總分配數(shù)(#Total):?????????????????????????????????????????????? 所有當(dāng)前已經(jīng)分配內(nèi)存,包括已經(jīng)被釋放了的對(duì)象或內(nèi)存 塊的總數(shù)。
臨時(shí)分配/全部?jī)?nèi)存分配(Transient/Total Bytes):當(dāng)前和全部分配數(shù)的直方圖葱峡。
當(dāng)比例變化時(shí),直方條會(huì)變顏色砚哗,Instruments 應(yīng)用通常給它們標(biāo)示不同的顏色來(lái)指出分配模式以便進(jìn)行進(jìn)一步的研 究。
詳細(xì)面板的數(shù)據(jù)表格包含了一個(gè)圖形列,其中包含了表中的每一行的復(fù)選框砰奕。當(dāng) 指定類(lèi)別的復(fù)選框被勾選時(shí),instrument 工具在跟蹤面板里面顯示特定類(lèi)別的圖形蛛芥。 Instruments 應(yīng)用通常給每個(gè)圖形類(lèi)別賦一個(gè)顏色。
當(dāng)你鼠標(biāo)移動(dòng)到詳細(xì)面板上面的類(lèi)別名稱(chēng)上時(shí),會(huì)在類(lèi)別名稱(chēng)的旁邊顯示一個(gè)更 多信息的按鈕军援。單擊該按鈕會(huì)顯示關(guān)于該類(lèi)別上的對(duì)象的詳細(xì)信息仅淑。