iOS-內(nèi)存問題

相對(duì)電腦而言,移動(dòng)設(shè)備具有內(nèi)存少、CPU速度慢等特點(diǎn),因此iOS開發(fā)人員需要盡可能優(yōu)化應(yīng)用的性能。性能優(yōu)化需要考慮的問題很多,本文主要介紹內(nèi)存的優(yōu)化。

1.內(nèi)存管理

OC的內(nèi)存管理方法,共有2種,分別如下:

MRC:(Manual Reference Counting)

就是由程序員自己負(fù)責(zé)管理對(duì)象生命周期,負(fù)責(zé)對(duì)象的創(chuàng)建和銷毀

ARC:(Automatic Reference Counting)

采用與MRC一樣的內(nèi)存引用計(jì)數(shù)管理方法,但不同的是,它在編譯時(shí)會(huì)在合適的位置插入對(duì)象內(nèi)存釋放(如release、autorelease和retain等),程序員不用關(guān)心對(duì)象釋放的問題。蘋果推薦在新項(xiàng)目中使用ARC,但在iOS5之前的系統(tǒng)中不能采用ARC。

2.使用Analyse和Instruments工具解決內(nèi)存泄露問題

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

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

看看下面這個(gè)方法有沒有問題?

- (void)viewDidLoad {? ? [superviewDidLoad];NSBundle*bundle = [NSBundlemainBundle];NSString*plistPath = [bundle pathForResource:@"team"ofType:@"plist"];// 獲取屬性列表文件中的全部數(shù)據(jù)self.listTeams= [[NSArrayalloc] initWithContentsOfFile:plistPath];}

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

在Xcode中,共提供了兩種工具幫助我們查找泄露點(diǎn):Analyse和Instruments。

Analyse

Analyze是靜態(tài)分析工具。可以通過Product->Analyze菜單項(xiàng)啟動(dòng)。使用Analyze工具進(jìn)行靜態(tài)分析之后的代碼界面如下圖:

Analyze靜態(tài)分析效果圖

凡是帶有藍(lán)色圖標(biāo)的行都是工具發(fā)現(xiàn)的疑似泄露點(diǎn)。點(diǎn)擊藍(lán)色圖標(biāo)會(huì)展開分析結(jié)果,如下圖所示:

Analyze靜態(tài)分析效果圖 2

上圖中的線,表明了程序執(zhí)行的路徑。第41行說明在這里創(chuàng)建了一個(gè)OC對(duì)象,引用計(jì)數(shù)器是1。第42行說明對(duì)象沒有釋放,懷疑有泄露。

Instruments

Instruments是動(dòng)態(tài)分析工具,它與Xcode集成在一起,可以在Xcode中通過Product->Profile菜單項(xiàng)啟動(dòng)。Instruments有很多跟蹤模板可以動(dòng)態(tài)分析和跟蹤內(nèi)存、CPU和文件系統(tǒng),界面如下圖:

Instruments動(dòng)態(tài)分析工具

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

文/暴走小熊貓(簡(jiǎn)書作者)

原文鏈接:http://www.itdecent.cn/p/ded9eb39c9b2

著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),并標(biāo)注“簡(jiǎn)書作者”。

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

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 用ARC管理內(nèi)存 ARC(Automatic ReferenceCounting, 自動(dòng)引用計(jì)數(shù))和iOS5...
    Icec閱讀 1,623評(píng)論 0 7
  • 內(nèi)存管理 簡(jiǎn)述OC中內(nèi)存管理機(jī)制。與retain配對(duì)使用的方法是dealloc還是release,為什么?需要與a...
    丶逐漸閱讀 2,081評(píng)論 1 16
  • iOS內(nèi)存問題: IBOutlet為啥是weak的?因?yàn)閟ubview添加到view上時(shí),view會(huì)“擁有”sub...
    davidxwwang閱讀 1,620評(píng)論 0 1
  • 早在iOS5.0的時(shí)候蘋果就引入了ARC的自動(dòng)管理機(jī)制,剛出來的時(shí)候,ARC模式還不是很健全,會(huì)存在內(nèi)存泄漏問題,...
    遛遛食閱讀 559評(píng)論 5 3
  • 現(xiàn)在iOS開發(fā)已經(jīng)是ARC甚至是swift的時(shí)代,但是內(nèi)存管理仍是一個(gè)重點(diǎn)關(guān)注的問題,如果只知盲目開發(fā)而不知個(gè)中原...
    碼代碼的小馬閱讀 623評(píng)論 0 1

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