在開發iOS應用程序時,讓程序具備良好的性能是很是關鍵的。這也是用戶所指望的,若是你的程序運行遲鈍或緩慢,會招致用戶的差評。然而因爲iOS設備的侷限性,有時候要想得到良好的性能,是很困難的。在開發過程當中,有許多事項須要記住,而且關於性能影響很容易就忘記。本文收集了25個關於能夠提高程序性能的提示和技巧。分爲3個不一樣的等級:初級、中級和高級: html
高級
當且僅當下面這些技巧可以解決問題的時候,才使用它們: ios
22.加速啓動時間
23.使用Autorelease Pool
24.緩存圖片 — 或者不緩存
25.儘可能避免Date格式化 緩存
高級性能提高 性能優化
尋找一些高明的方法,讓本身變爲一個全代碼忍者?下面這些高級的性能優化技巧能夠在適當的時候讓程序儘量的高效運行! 網絡
22) 加速啓動時間 app
能快速的啓動程序很是重要,特別是在用戶第一次啓動程序時。第一映像對程序來講很是重要! iphone
讓程序儘可能快速啓動的方法就是儘可能以異步方式執行任務,例如網絡請求,數據訪問或解析。 異步
另外,避免使用臃腫的XIBs,由於XIB的加載是在主線程中進行的。可是記住storyboard沒有這樣的問題——因此若是能夠的話就使用storyboard吧! ide
注意:在利用Xcode進行調試時,watchdog不會運行,所在設備中測試程序啓動性能時,不要將設備鏈接到Xcode。 函數
23) 使用Autorelease Pool
NSAutoreleasePool負責釋放一個代碼塊中的自動釋放對象。通常都是由UIKit來建立的。不過有些狀況下須要手動建立NSAutoreleasePool。
例如,若是在代碼中建立了大量的臨時對象,你將注意到內存使用量在增長,直到這些對象被釋放。問題是隻有當UIKit耗盡了 autorelease pool,這些對象纔會被釋放,也就是說當再也不須要這些對象以後,這些對象還在內存中佔據着資源。
不過這個問題徹底能夠避免:在@autoreleasepool代碼塊中建立臨時對象,以下代碼:
- NSArray *urls = <# An array of file URLs #>;
- for (NSURL *url in urls) {
- @autoreleasepool {
- NSError *error;
- NSString *fileContents = [NSString stringWithContentsOfURL:url
- encoding:NSUTF8StringEncoding error:&error];
- /* Process the string, creating and autoreleasing more objects. */
- }
- }
當每次迭代完以後,都會釋放全部的autorelease對象。
關於NSAutoreleasePool的更多內容能夠閱讀蘋果的官方文檔。
24) 緩存圖片--或者不緩存
iOS中從程序bundle中加載UIImage通常有兩種方法。
第一種比較常見:imageNamed。
第二種方法不多使用:imageWithContentsOfFile
爲何有兩種方法完成一樣的事情呢?imageNamed的優勢在於能夠緩存已經加載的圖片。蘋果的文檔中有以下說法:
This method looks in the system caches for an image object with the specified name and returns that object if it exists. If a matching image object is not already in the cache, this method loads the image data from the specified file, caches it, and then returns the resulting object.
這種方法會在系統緩存中根據指定的名字尋找圖片,若是找到了就返回。若是沒有在緩存中找到圖片,該方法會從指定的文件中加載圖片數據,並將其緩存起來,而後再把結果返回。
而imageWithContentsOfFile方法只是簡單的加載圖片,並不會將圖片緩存起來。這兩個方法的使用方法以下:
- UIImage *img = [UIImage imageNamed:@"myImage"]; // caching
- // or
- UIImage *img = [UIImage imageWithContentsOfFile:@"myImage"]; // no caching
那麼該如何選擇呢?
若是加載一張很大的圖片,而且只使用一次,那麼就不須要緩存這個圖片。這種狀況imageWithContentsOfFile比較合適——系統不會浪費內存來緩存圖片。
然而,若是在程序中常常須要重用的圖片,那麼最好是選擇imageNamed方法。這種方法能夠節省出每次都從磁盤加載圖片的時間。
25) 儘可能避免Date格式化
若是有許多日期須要使用NSDateFormatter,那麼須要當心對待了。如以前(重用花銷很大的對象)所提到的,不管何時,都應該儘可能重用NSDateFormatters。
然而,若是你須要更快的速度,那麼應該使用C來直接解析日期,而不是NSDateFormatter。Sam Soffes寫了一篇文章,其中提供了一些解析ISO-8601格式日期字符的串代碼。你只須要簡單的調整一下其中的代碼就能夠知足本身特殊的需求了。
這聽起來不錯把——不過,你相信這還有更好的一個辦法嗎?
若是你本身能控制處理日期的格式,那麼能夠選擇 Unix timestamps(http://en.wikipedia.org/wiki/Unix_time)。Unix timestamps是一個簡單的整數,表明了重新紀元時間(epoch)開始到如今已通過了多少秒,一般這個新紀元參考時間是00:00:00 UTC on 1 January 1970。
你能夠很容易的見這個時間戳轉換爲NSDate,以下所示:
- - (NSDate*)dateFromUnixTimestamp:(NSTimeInterval)timestamp {
- return [NSDate dateWithTimeIntervalSince1970:timestamp];
- }
上面這個方法比C函數還要快!
注意:許多網絡APIs返回的時間戳都是毫秒,所以須要注意的是在將這個時間戳傳遞給dateFromUnixTimestamp以前須要除以1000。
何去何從?
強烈建議對程序性能優化感興趣的讀者看看下面列出來的WWDC視頻。在看視頻以前,你須要註冊一個Apple ID(註冊後就能夠觀看全部WWDC2012的視頻):
#406: Adopting Automatic Reference Counting
#238: iOS App Performance: Graphics and Animations
#242: iOS App Performance: Memory
#235: iOS App Performance: Responsiveness
#409: Learning Instruments
#706: Networking Best Practices
#514: OpenGL ES Tools and Techniques
#506: Optimizing 2D Graphics and Animation Performance
#601: Optimizing Web Content in UIWebViews and Websites on iOS
#225: Up and Running: Making a Great Impression with Every Launch
下面這些視頻來自WWDC 2011 ,也很是有用:
#308: Blocks and Grand Central Dispatch in Practice
#323: Introducing Automatic Reference Counting
#312: iOS Performance and Power Optimization with Instruments
#105: Polishing Your App: Tips and tricks to improve the responsiveness and performance
#121: Understanding UIKit Rendering
這裏還有更多相關視頻,大多數來自iOS 5技術講座:
Optimizing App Performance with Instruments
Understanding iOS View Compositing
基於 「Your iOS App Performance Hitlist」 視頻,Ole Begemann寫了一篇文章。蘋果還提供了一篇很是好的文章:性能優化。其中提供的技巧和提示對程序性能提高頗有幫助。