国产精品无码av有声小说-天堂av2024-久久国产剧情-午夜视频一区-国内自拍xxxx18-男女啪啪免费-在线国产福利-中文字幕在线三区-天天艹日日干-色眯眯视频-天天干天天操天天爱-性欧美丰满熟妇xxxx性久久久-精品国产一区二区在线-污视频网站免费在线观看-98久久久-日日夜夜爽爽-乌克兰性欧美精品高清

歡迎來到酷云建站平臺,全網(wǎng)營銷云系統(tǒng)加盟中心!

海量企業(yè)網(wǎng)站模板 · 任您選擇

美出特色,精出品質(zhì),一切為了企業(yè)更好的營銷

隱藏側(cè)欄
Beta
轉(zhuǎn)載

APP開發(fā)之使用Analyze和Instruments工具解決內(nèi)存泄漏問題

       小程序     2021-12-16     admin     151     0    

內(nèi)存泄漏指一個對象或變量在使用完成后沒有釋放掉,這個對象一直占用這部分內(nèi)存,直到應(yīng)用停止。如果這種對象過多,內(nèi)存就會耗盡,其他應(yīng)用就無法運行。這個在問題C++、C和Objective-C的MRC中是比較普遍的問題。

在Objective-C中,釋放對象的內(nèi)存時,可以發(fā)送release和autorelease消息,它們都可以將引用計數(shù)減1。當(dāng)引用計數(shù)為0時,release消息會使對象立刻釋放,autorelease消息會將對象放入內(nèi)存釋放池中延遲釋放。

下面徐州APP制作開發(fā)公司-百恒網(wǎng)絡(luò)為您介紹一下Objective-C工程中ViewController的代碼片段:

Objective-C工程中ViewController的代碼片段一

Objective-C工程中ViewController的代碼片段二

大家看看,上面的這3個方法會有什么問題呢?如果代碼基于ARC,這是沒有問題的,但遺憾的這是基于MRC的,都存在內(nèi)存泄漏的可能性。從理論上講,內(nèi)存泄漏是由對象或變量沒有釋放引起的,但實踐證明并非所有的未釋放對象或變量都會導(dǎo)致內(nèi)存泄漏,這與硬件環(huán)境和操作系統(tǒng)環(huán)境有關(guān),因此我們需要檢測工具幫助我們找到這些“泄漏點”。

在Xcode中,共提供了兩種工具幫助查找泄漏點:Analyze和Instruments。Analyze是靜態(tài)分析工具??梢酝ㄟ^Product→Analyze菜單項啟動。圖1所示為使用Analyze工具進行靜態(tài)分析之后的代碼界面。Instruments是動態(tài)分析工具,它與Xcode集成在一起,可以在Xcode中通過Product→Profile菜單項啟動。如圖2所示,Instruments有很多跟蹤模板可以動態(tài)分析和跟蹤內(nèi)存、CPU和文件系統(tǒng)。

使用Analyze進行靜態(tài)分析的代碼界面

Instruments分析工具

我們可以結(jié)合使用這兩個工具查找泄漏點。先使用Analyze靜態(tài)分析查找可疑泄漏點,再用Instruments動態(tài)分析中的Leaks和Allocations跟蹤模板進行動態(tài)跟蹤分析,確認這些點是否泄漏,或者是否有新的泄漏出現(xiàn)等。

在圖1所示的Analyze靜態(tài)分析結(jié)果中,凡是有圖標(biāo)的行都是工具發(fā)現(xiàn)的疑似泄漏點。點擊viewDidLoad方法中疑似泄漏點行末尾的圖標(biāo),會展開分析結(jié)果,具體如圖3所示。

viewDidLoad方法的疑似泄漏點展開結(jié)果

圖3中的線表明了程序執(zhí)行的路徑。在這個路徑中,第1處說明在第25行中,Objective-C對象的引用計數(shù)是1,說明在這里創(chuàng)建了一個Objective-C對象。第2處說明在第27行中引用計數(shù)為1,該對象沒有釋放,懷疑有泄漏。這樣的說明已經(jīng)很明顯地告訴我們問題所在了,[[NSArray alloc] initWithContentsOfFile:plistPath]創(chuàng)建了一個對象,并賦值給listTeams屬性所代表的成員變量,然而完成了賦值工作之后,創(chuàng)建的對象并沒有顯式地發(fā)送release和autorelease消息。這里可以將代碼修改如下:

NSArray *array = [[NSArray alloc] initWithContentsOfFile:plistPath];

self.listTeams = array;

[array release];

點擊tableView:cellForRowAtIndexPath:方法中疑似泄漏點行末尾的圖標(biāo),展開分析結(jié)果,如圖4所示。

tableView:cellForRowAtIndexPath:方法的疑似泄漏點展開結(jié)果

這主要說明UITableViewCell *類型的cell對象在第64行有可能存在泄漏。在表視圖中,tableView:cellForRowAtIndexPath:方法用于實例化表視圖單元格并設(shè)置數(shù)據(jù),因此cell對象實例化后不能馬上釋放,而應(yīng)該使用autorelease延遲釋放??梢栽趧?chuàng)建cell對象時發(fā)送autorelease消息,將代碼修改如下:

if (cell == nil) {

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault

reuseIdentifier:CellIdentifier] autorelease];

}

我們再看一下tableView:didSelectRowAtIndexPath:方法中的疑似泄漏點,共有兩個。點擊行末尾的圖標(biāo),展開分析結(jié)果,具體如圖5和圖6所示。

圖5 tableView:didSelectRowAtIndexPath:方法疑似泄漏點1的展現(xiàn)結(jié)果 圖6 tableView:didSelectRowAIndexPath:方法疑似泄漏點2的展開結(jié)果

圖5所示的是message對象創(chuàng)建之后沒有釋放,我們只需要在[alert show]之后添加[message release]語句代碼就可以了。

在Objective-C中,實例化對象有如下兩種方式:

NSString *message = [[NSString alloc] initWithFormat:@'您選擇了%@隊。', rowValue]; ①

NSString *message = [NSString stringWithFormat:@'您選擇了%@隊。', rowValue]; ②

第①行所示的以init開頭的構(gòu)造方法在alloc之后調(diào)用,我們將其稱為“實例構(gòu)造方法”。對于使用該方法創(chuàng)建的對象,其所有權(quán)是調(diào)用者,調(diào)用者需要對它的生命周期負責(zé),具體說就是負責(zé)創(chuàng)建和釋放。第②行所示的以string開頭的方法,它通過類直接調(diào)用,我們將其稱為“類級構(gòu)造方法”。對于使用該方法創(chuàng)建的對象,其所有權(quán)非調(diào)用者所有,調(diào)用者無權(quán)釋放它,否則就會因過度釋放而“僵尸化”。

圖6所示的是UIAlertView *類型的alert對象創(chuàng)建后沒有釋放,我們只需要在[alert show]之后添加[alertrelease]語句就可以了。修改之后的代碼如下:

UIAlertView *類型的alert對象創(chuàng)建后沒有釋放

上面介紹的是使用Analyze靜態(tài)分析查找可疑泄漏點。之所以稱為“可疑泄漏點”,是因為這些點未必一定泄漏。確認這些點是否泄漏,還要通過Instruments動態(tài)分析工具中的Leaks和Allocations跟蹤模板。Analyze靜態(tài)分析只是一個理論上的預(yù)測過程。在Xcode中通過Product→Profile菜單項啟動Instruments動態(tài)分析工具,接著選擇Leaks模板,打開的界面如圖7所示。

Instruments的Leaks模板

在Instruments中,雖然選擇了Leaks模板,但默認情況下也會添加Allocations模板?;旧戏彩欠治鰞?nèi)存都會使用Allocations模板,它可以監(jiān)控內(nèi)存分布情況。選中Allocations模板(圖中①區(qū)域),右邊的③區(qū)域會顯示隨著時間的變化內(nèi)存使用的折線圖,同時在④區(qū)域會顯示內(nèi)存使用的詳細信息以及對象分配情況。點擊Leaks模板(圖中②區(qū)域),可以查看內(nèi)存泄漏情況。如圖8所示,如果在③區(qū)域有紅線出現(xiàn),則有內(nèi)存泄漏,④區(qū)域則會顯示泄漏的對象。

Instruments檢測到的內(nèi)存泄漏

圖8中出現(xiàn)的泄漏是在點擊表視圖中單元格測試tableView:didSelectRowAtIndexPath:方法時發(fā)生的,點擊泄漏對象Address列后面的按鈕,會進入如圖9所示的詳細界面??梢园l(fā)現(xiàn),里面有兩個對象,可以看到它們的內(nèi)存地址、占用字節(jié)、所屬框架和響應(yīng)方法等信息。

查看泄露的詳細信息

在圖9中,點擊右邊的跟蹤堆棧信息按鈕,如圖10所示,其中圖標(biāo)所示的條目是我們自己應(yīng)用的代碼,點擊它即可進入程序代碼,如圖11所示。

圖10 查看堆棧信息 圖11 查看泄漏點

圖11所示的第84行代碼是可能的泄漏點。事實上,內(nèi)存泄漏是極其復(fù)雜的問題,工具使用是一方面,經(jīng)驗是另一方面。提高經(jīng)驗,然后借助于工具才是解決內(nèi)存泄漏的根本。


--結(jié)束END--

本文鏈接: http://m.sh-linbin.cn/start/2387.html (轉(zhuǎn)載時請注明來源鏈接)

 
本文標(biāo)簽: 全部

下班PC閱讀不方便?

手機也可以隨時學(xué)習(xí)開發(fā)

微信關(guān)注公眾號“酷云”
"酷云平臺前端開發(fā)教學(xué)"
每日干貨技術(shù)分享
 

×

成為 酷云平臺 代理商!

關(guān)注

微信
關(guān)注

微信掃一掃
獲取最新優(yōu)惠信息

酷云平臺公眾號

客服

聯(lián)系
客服

很高興為您服務(wù)
尊敬的用戶,歡迎您咨詢,我們?yōu)樾掠脩魷?zhǔn)備了優(yōu)惠好禮。 咨詢客服

聯(lián)系客服:

在線QQ: 3206174

客服電話: 0516-83703228

售前咨詢 售后服務(wù)
在線交談 智能小云

工作時間:

周一至周五: 09:00 - 17:00

WAP

手機
訪問

移動端訪問
手機上也能選模板

酷云平臺手機端

乐昌市| 城固县| 景泰县| 景德镇市| 武胜县| 从江县| 修水县| 广元市| 南木林县| 察隅县| 亳州市| 阳新县| 广宗县| 庆城县| 洛浦县| 五家渠市| 北宁市| 应用必备| 博客| 拉萨市| 沙洋县| 栖霞市| 甘孜县| 旅游| 库车县| 巴林左旗| 安西县| 连城县| 陇南市| 舞钢市| 江源县| 吉木乃县| 青河县| 九龙坡区| 吐鲁番市| 册亨县| 锡林郭勒盟| 观塘区| 旌德县| 胶南市| 唐河县|