在開發iOS應用程序時,讓程序具有良好的性能是非常關鍵的。這也是用戶所期望的,如果你的程序運行遲鈍或緩慢,會招致用戶的差評。
然而由于iOS設備的局限性,有時候要想獲得良好的性能,是很困難的。在開發過程中,有許多事項需要記住,并且關于性能影響很容易就忘記。
這就是為什么我要寫這篇文章!本文收集了25個關于可以提升程序性能的提示和技巧。
目錄
我把性能優化技巧分為3個不同的等級:初級、中級和高級:
中級
在性能優化時,當你碰到一些復雜的問題,應該注意和使用如下技巧:
重用和延遲加載View
緩存、緩存、緩存
考慮繪制
處理內存警告
重用花銷很大的對象
使用Sprite Sheets
避免重新處理數據
選擇正確的數據格式
設置適當的背景圖片
降低Web內容的影響
設置陰影路徑
優化TableView
選擇正確的數據存儲方式
中級性能提升
現在,在進行代碼優化時,你已經能夠完成一些初級性能優化了。但是下面還有另外一些優化方案,雖然可能不太明顯(取決于程序的架構和相關代碼),但是,如果能夠正確的利用好這些方案,那么它們對性能的優化將非常明顯!
9) 重用和延遲加載View
程序界面中包含更多的view,意味著界面在顯示的時候,需要進行更多的繪制任務;也就意味著需要消耗更多的CPU和內存資源。特別是在一個UIScrollView里面加入了許多view。
這種情況的管理技巧可以參考UITableView和UICollectionView的行為:不要一次性創建所有的subview,而是在需要的時候在創建view,并且當view使用完畢時候將它們添加到重用隊列中。
這樣就可以僅在UIScrollView滾動的時候才配置view,以此可以避免分配創建view的帶來的成本——這可能是非常耗資源的。
現在有這樣的一個問題:在程序中需要顯示的view在什么時機創建(比如說,當用戶點擊某個按鈕,需要顯示某個view)。這里有兩種可選方法:
在屏幕第一次加載以及隱藏的時候,創建view;然后在需要的時候,再把view顯示出來。
直到需要顯示view的時候,才創建并顯示view。
每種方法都有各自的優點和確定。
使用第一種方法,需要消耗更多的內容,因為創建出來的view一直占據著內存,直到view被release掉。不過,使用這種方法,當用戶點擊按鈕時,程序會很快的顯示出view,因為只需要修改一下view的可見性即可。
而使用第二種方法則產生相反的效果;當需要的時候猜創建view,這會消耗更少的內存;不過,當用戶點擊按鈕的時候,不會立即顯示出view。
10) 緩存、緩存、緩存
在開發程序時,一個重要的規則就是“緩存重要的內容”——這些內容一般不會改變,并且訪問的頻率比較高。
可以緩存寫什么內容呢?比如遠程服務器的響應內容,圖片,甚至是計算結果,比如UITableView的行高。
NSURLConnection根據HTTP頭的處理過程,已經把一些資源緩存到磁盤和內存中了。你甚至可以手動創建一個NSURLRequest ,讓其只加載緩存的值。
下面的代碼片段一般用在為圖片創建一個NSURLRequest:
+ (NSMutableURLRequest *)imageRequestWithURL:(NSURL *)url { NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.cachePolicy = NSURLRequestReturnCacheDataElseLoad; // this will make sure the request always returns the cached image request.HTTPShouldHandleCookies = NO; request.HTTPShouldUsePipelining = YES; [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; return request;}
注意:你可以使用NSURLConnection抓取一個URL請求,但是同樣可以使用AFNetworking來抓取,這種方法不用修改所有網絡相關的代碼——這是一個技巧!:]
如果你要直到更多關于HTTP 緩存, NSURLCache, NSURLConnection 以及相關的內容, 那么看一下NSHipster中的the NSURLCache entry。
如果你需要緩存的內容沒涉及到HTTP請求,那么使用NSCache。
NSCache的外觀和行為與NSDictionary類似, 但是,當系統需要回收內存時,NSCache會自動的里面存儲的內容。Mattt Thompson 在NSHipster上寫了一篇關于NSCache非常不錯的文章。
如果還想知道關于HTTP緩存更多的內容,那么建議閱讀一下Google的這篇文章:best-practices document on HTTP caching。
11) 考慮繪制
考慮繪制
在iOS中制作漂亮的按鈕有多種方法??梢允褂萌叽鐖D片,可縮放圖片,或者使用CALayer, CoreGraphics, 甚至是OpenGL來手動測量和繪制按鈕。
當然,這些方法的復雜程度也不同,并且性能也有所區別。這里有一篇相關文章值得閱讀一下:關于iOS中圖形的性能。其中Andy Matuschak(曾經是蘋果的UIKit小組的組員)對這篇文章的評論中,對于不同的方法及其性能權衡有非常好的一個見解。
簡單來說,使用預渲染圖片技術是最快的,因為iOS中不用等到在屏幕上顯示的時候才創建圖形和對形狀進行繪制(圖片已經創建好了!)。這樣帶來的問題是需要把所有的圖片都放到程序bundle中,從而增加了程序的大小。因此使用可伸縮圖片在這里將排上用場了:可以移除“浪費”空間的圖片——iOS可以重復利用。并且針對不同的元素(例如按鈕)不需要創建不同的圖片。
不過,使用圖片的話會失去代碼對圖片的控制能力,進而針對不同的程序,就需要重復的生成每一個需要的圖片,并反復的放到每個程序中。這個處理過程一般會比較慢。另外一點就是如果你需要一個動畫,或者許多圖片都要進行輕微的調整(比如多個顏色的覆蓋),那么需要在程序中加入許多圖片,進而增加了程序bundle的大小。