相對電腦而言,移動設備具有內存少、CPU速度慢等特點,因此iOS開發人員需要盡可能優化應用的性能。性能優化需要考慮的問題很多,本文主要介紹內存的優化。
1.內存管理
OC的內存管理方法,共有2種,分別如下:
MRC:(Manual Reference Counting)
就是由程序員自己負責管理對象生命周期,負責對象的創建和銷毀
ARC:(Automatic Reference Counting)
采用與MRC一樣的內存引用計數管理方法,但不同的是,它在編譯時會在合適的位置插入對象內存釋放(如release、autorelease和retain等),程序員不用關心對象釋放的問題。蘋果推薦在新項目中使用ARC,但在iOS5之前的系統中不能采用ARC。
2.使用Analyse和Instruments工具解決內存泄露問題
內存泄露指一個對象或變量在使用完成后沒有釋放掉,這個對象一直占用這部分內存,直到應用停止。如果這種對象過多,內存就會耗盡,其他應用就無法運行。這個問題在MRC中是比較普遍的問題。
在OC中,釋放對象的內存時,可以發送release和autorelease消息,它們都可以將引用計數減1。當引用計數為0時,release消息會使對象立刻釋放,autorelease消息會將對象放入內存釋放池中延遲釋放。
看看下面這個方法有沒有問題?
- (void)viewDidLoad {? ? [superviewDidLoad];NSBundle*bundle = [NSBundlemainBundle];NSString*plistPath = [bundle pathForResource:@"team"ofType:@"plist"];// 獲取屬性列表文件中的全部數據self.listTeams= [[NSArrayalloc] initWithContentsOfFile:plistPath];}
如果代碼基于ARC,這是沒有問題的,但基于MRC,這就存在內存泄露的可能性。從理論上講,內存泄露是由于對象或者變量沒有釋放引起的,但實踐證明并非所有的未釋放對象或變量都會導致內存泄露,這與硬件環境和操作系統環境有關,因此我們需要檢測工具幫助我們找到這些“泄露點”。
在Xcode中,共提供了兩種工具幫助我們查找泄露點:Analyse和Instruments。
Analyse
Analyze是靜態分析工具。可以通過Product->Analyze菜單項啟動。使用Analyze工具進行靜態分析之后的代碼界面如下圖:
Analyze靜態分析效果圖
凡是帶有藍色圖標的行都是工具發現的疑似泄露點。點擊藍色圖標會展開分析結果,如下圖所示:
Analyze靜態分析效果圖 2
上圖中的線,表明了程序執行的路徑。第41行說明在這里創建了一個OC對象,引用計數器是1。第42行說明對象沒有釋放,懷疑有泄露。
Instruments
Instruments是動態分析工具,它與Xcode集成在一起,可以在Xcode中通過Product->Profile菜單項啟動。Instruments有很多跟蹤模板可以動態分析和跟蹤內存、CPU和文件系統,界面如下圖:
Instruments動態分析工具
我們可以結合使用Analyse和Instruments這兩個工具查找泄露點。先使用Analyze靜態分析查找可以泄露點,再用Instruments動態分析中的Leaks和Allocations跟蹤模板進行動態跟蹤分析,確認這些點是否泄露,或者是否有新的泄露出現等。
文/暴走小熊貓(簡書作者)
原文鏈接:http://www.lxweimin.com/p/ded9eb39c9b2
著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。