在開發iOS應用程序時,讓程序具有良好的性能是非常關鍵的。這也是用戶所期望的,如果你的程序運行遲鈍或緩慢,會招致用戶的差評。
然而由于iOS設備的局限性,有時候要想獲得良好的性能,是很困難的。在開發過程中,有許多事項需要記住,并且關于性能影響很容易就忘記。
這就是為什么我要寫這篇文章!本文收集了25個關于可以提升程序性能的提示和技巧。
目錄
我把性能優化技巧分為3個不同的等級:初級、中級和高級:
初級
在開發過程中,下面這些初級技巧需要時刻注意:
使用ARC進行內存管理
在適當的情況下使用reuseIdentifier
盡可能將View設置為不透明(Opaque)
避免臃腫的XIBs
不要阻塞主線程
讓圖片的大小跟UIImageView一樣
選擇正確的集合
使用GZIP壓縮
初級性能提升
本部分內容介紹幾本的程序性能提升技巧。其實所有級別的開發者都能從中獲益。
1) 使用ARC進行內存管理
ARC是在iOS 5中發布的,它解決了最常見的內存泄露問題——也是開發者最容易健忘的。
ARC的全稱是“Automatic Reference Counting”——自動引用計數,它會自動的在代碼中做retain/release工作,開發者不用再手動處理。
下面是創建一個View通用的一些代碼塊:
UIView *view = [[UIView alloc] init];// ...[self.view addSubview:view];[view release];
在上面代碼結束的地方很容易會忘記調用release。不過當使用ARC時,ARC會在后臺自動的幫你調用release。
ARC除了能避免內存泄露外,還有助于程序性能的提升:當程序中的對象不再需要的時候,ARC會自動銷毀對象。所以,你應該在工程中使用ARC。
下面是一些學習ARC很棒的一些資源:
蘋果的官方文檔
Matthijs Hollemans的初級ARC
Tony Dahbura的如何在Cocos2D 2.X工程中使用ARC
如果你仍然不確定ARC帶來的好處,那么看一些這篇文章:8個關于ARC的神話——這能夠讓你相信你應該在工程中使用ARC!
值得注意的是,ARC并不能避免所有的內存泄露。使用ARC之后,工程中可能還會有內存泄露,不過引起這些內存泄露的主要原因是:block,retain循環,對CoreFoundation對象(通常是C結構)管理不善,以及真的是代碼沒寫好。
這里有一篇文章是介紹哪些問題是ARC不能解決的 — 以及如何處理這些問題。
2) 在適當的情況下使用reuseIdentifier
在適當的情況使用reuseIdentifier
在iOS程序開發中一個普遍性的錯誤就是沒有正確的為UITableViewCells、UICollectionViewCells和UITableViewHeaderFooterViews設置reuseIdentifier。
為了獲得最佳性能,當在tableView:cellForRowAtIndexPath:方法中返回cell時,table view的數據源一般會重用UITableViewCell對象。table view維護著UITableViewCell對象的一個隊列或者列表,這些數據源已經被標記為重用了。
如果沒有使用reuseIdentifier會發生什么?
如果你在程序中沒有使用reuseIdentifier,table view每次顯示一個row時,都會配置一個全新的cell。這其實是一個非常消耗資源的操作,并且會影響程序中table view滾動的效率。
自iOS 6以來,你可能還希望header和footer views,以及UICollectionView的cell和supplementary views。
為了使用reuseIdentifiers,在table view請求一個新的cell時,在數據源中調用下面的方法:
static NSString *CellIdentifier = @"Cell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
如果table view維護的UITableViewCell隊列或列表中有可用的cell,則從隊列從移除一個已經存在的cell,如果沒有的話,就從之前注冊的nib文件或類中創建一個新的cell。如果沒有可以重用的cell,并且沒有注冊nib文件或類,tableview的dequeueReusableCellWithIdentifier:方法會返回一個nil。
3) 盡可能將View設置為不透明(Opaque)
盡量將view設置為Opaque
如果view是不透明的,那么應該將其opaque屬性設置為YES。
為什么要這樣做呢?這樣設置可以讓系統以最優的方式來繪制view。opaque屬性可以在Interface Builder或代碼中設置。
蘋果的官方文檔對opaque屬性有如下解釋:
This property provides a hint to the drawing system as to how it should treat the view. If set to YES, the drawing system treats the view as fully opaque, which allows the drawing system to optimize some drawing operations and improve performance. If set to NO, the drawing system composites the view normally with other content. The default value of this property is YES.
(opaque屬性提示繪制系統如何處理view。如果opaque設置為YES,繪圖系統會將view看為完全不透明,這樣繪圖系統就可以優化一些繪制操作以提升性能。如果設置為NO,那么繪圖系統結合其它內容來處理view。默認情況下,這個屬性是YES。)
如果屏幕是靜止的,那么這個opaque屬性的設置與否不是一個大問題。但是,如果view是嵌入到scroll view中的,或者是復雜動畫的一部分,不將設置這個屬性的話肯定會影響程序的性能!
可以通過模擬器的Debug\Color Blended Layers選項來查看哪些view沒有設置為不透明。為了程序的性能,盡可能的將view設置為不透明!