instrument里面包含了很多工具犁珠,內(nèi)存溢出分析,性能分析互亮,各種分析…… 這里就不細(xì)說了.
主要看看專用debug的內(nèi)存溢出分析工具的使用
Analyze靜態(tài)分析
相信IOS開發(fā)者在App進(jìn)行Build或Archive時(shí)犁享,會(huì)產(chǎn)生很多編譯警告,這些警告是編譯時(shí)產(chǎn)生的豹休,靜態(tài)分析的過程也類似炊昆,在XCode Product菜單下,點(diǎn)擊Analyze對(duì)App進(jìn)行靜態(tài)分析威根。
Analyze主要分析以下四種問題:
邏輯錯(cuò)誤:訪問空指針或未初始化的變量等凤巨;
內(nèi)存管理錯(cuò)誤:如內(nèi)存泄漏等;
聲明錯(cuò)誤:從未使用過的變量洛搀;
Api調(diào)用錯(cuò)誤:未包含使用的庫和框架敢茁。
<li>Analyze內(nèi)存泄漏分析</li>
聲明錯(cuò)誤、邏輯錯(cuò)誤留美、Api調(diào)用錯(cuò)誤基本在編譯時(shí)都會(huì)有警告彰檬,Analyze的主要優(yōu)勢在于靜態(tài)分析內(nèi)存泄漏及代碼邏輯錯(cuò)誤。
比如在開啟arc的環(huán)境下谎砾,輸入以下一段代碼:
//截取部分圖像
+(UIImage*)getSubImage:(unsigned long)ulUserHeader
{
UIImage * sourceImage = [UIImage imageNamed:@"header.png"];
CGFloat height = sourceImage.size.height;
CGRect rect = CGRectMake(0 + ulUserHeader*height, 0, height, height);
CGImageRef imageRef = CGImageCreateWithImageInRect([sourceImage CGImage], rect);
UIImage* smallImage = [UIImage imageWithCGImage:imageRef];
//CGImageRelease(imageRef);
return smallImage;
}
用注釋注釋掉CGImageRelease(imageRef)這行逢倍,雖然開起了arc,不過仍然會(huì)導(dǎo)致imageRef對(duì)象泄漏景图。
使用Analyze進(jìn)行分析较雕,在導(dǎo)航欄Analyze選擇Analyzer查看分析結(jié)果:
Analyze已經(jīng)分析出imageRef對(duì)象有內(nèi)存泄漏,這種情況在編譯時(shí)是無法發(fā)現(xiàn)的挚币。
如果你沒有使用ARC亮蒋,那么Analyze更有用扣典。
Analyze的其他三種分析也可以使用,相比編譯器給出的信息更明確宛蚓。
<li>Analyze邏輯錯(cuò)誤監(jiān)測</li>
這種情況在codereview時(shí)也較難發(fā)現(xiàn)激捏,可以借助Analyze。
如上代碼凄吏,當(dāng)Tag不等于1远舅、2和3的時(shí)候,就會(huì)出現(xiàn)很問題了痕钢。
Analyze還給出了箭頭提示:len is a garbage value图柏。建議在聲明變量時(shí),同時(shí)進(jìn)行初始化任连。
leaks工具
點(diǎn)擊Product->Profile蚤吹,然后選擇那個(gè)漏水的水管Leaks,進(jìn)入界面后随抠,點(diǎn)擊運(yùn)行裁着,instruments就會(huì)開始自動(dòng)檢測內(nèi)存泄露的地方了,在這個(gè)過程中拱她,可以對(duì)手機(jī)上運(yùn)行的測試工程進(jìn)行操作二驰,圖形界面中,上面是Allocations秉沼,下面是Leaks桶雀,當(dāng)出現(xiàn)了一條紅色的小柱子的時(shí)候,就是出現(xiàn)了內(nèi)存泄露唬复;點(diǎn)擊界面中間分隔條矗积,選擇Call Tree選項(xiàng),然后把右邊的 “Invert Call Tree” 和 “Hide System Libraries”選項(xiàng)敞咧,就可以看到具體是那個(gè)類中得哪個(gè)方法出現(xiàn)了內(nèi)存泄露了棘捣,雙擊類名,就出顯示出此類此方法中造成的內(nèi)存泄露代碼休建,ok乍恐,接下來就是有針對(duì)性的進(jìn)行代碼優(yōu)化,內(nèi)存優(yōu)化了丰包。
由于現(xiàn)在用得都是ARC模式,所以一般出現(xiàn)泄露的地方都是block中的self疏忽了壤巷,沒有使用weak類型邑彪;或者,兩個(gè)類之間出現(xiàn)了循環(huán)應(yīng)用這種低級(jí)錯(cuò)誤引起的胧华。
打開Xcode自帶的Instruments:
或者:
選擇Leaks選項(xiàng)
下面我們進(jìn)入正式的測試寄症。
1.選中Xcode先把程序(command + R)運(yùn)行起來宙彪。
2.再選中Xcode,按快捷鍵(command + control + i)運(yùn)行起來,此時(shí)Leaks已經(jīng)跑起來了有巧。
3.由于Leaks是動(dòng)態(tài)監(jiān)測释漆,所以我們需要手動(dòng)操作APP,一邊操作,一邊觀察Leaks的變化篮迎,當(dāng)出現(xiàn)紅色叉時(shí)男图,就監(jiān)測到了內(nèi)存泄露,點(diǎn)擊右上角的第二個(gè)甜橱,進(jìn)行暫停檢測(也可繼續(xù)檢測逊笆,當(dāng)多個(gè)時(shí)暫停,一次處理了多個(gè)).如圖所示:
4.下面就是定位修改了,此時(shí)選中有紅色柱子的Leaks岂傲,下面有個(gè)"田"字方格难裆,點(diǎn)開,選中Call Tree镊掖,顯示如下圖界面:
5.下面就是最關(guān)鍵的一步乃戈,在這個(gè)界面的右下角有若干選框,選中Invert Call Tree 和Hide System Libraries,(紅圈范圍內(nèi))顯示如下:
到這里就算基本完成啦亩进,這里顯示的就是內(nèi)存泄露代碼部分症虑,那么現(xiàn)在還差一步:定位!
6.選中顯示的若干條中的一條,雙擊镐侯,會(huì)自動(dòng)跳到內(nèi)存泄露代碼處侦讨,如圖所示
7.最后一步,就是根據(jù)內(nèi)存泄露的提示修改代碼了苟翻!