這是一篇關於增強iOS應用程序性能的文章,學會初級篇後看看小編為大家整理的中級篇吧.
重用和延遲加載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。
緩存、緩存、緩存
在開發程序時,一個重要的規則就是“緩存重要的內容”——這些內容一般不會改變,並且訪問的頻率比較高。
可以緩存寫什麼內容呢?比如遠程服務器的響應內容,圖片,甚至是計算結果,比如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來抓取,這種方法不用修改所有網絡相關的代碼——這是一個技巧!
在iOS中制作漂亮的按鈕有多種方法。可以使用全尺寸圖片,可縮放圖片,或使用CALayer, CoreGraphics, 甚至是OpenGL來手動測量和繪制按鈕。
這些方法的復雜程度不同,性能也有區別。這篇關於iOS中圖形性能的文章值得一讀。其中Andy Matuschak(曾經是蘋果的UIKit小組的組員)對這篇文章的評論中,對於不同的方法及其性能權衡有非常好的一個見解。
簡單來說,使用預渲染圖片技術是最快的,因為iOS中不用等到在屏幕上顯示的時候才創建圖形和對形狀進行繪制(圖片已經創建好了!)。這樣帶來的問 題是需要把所有的圖片都放到程序bundle中,從而增加了程序的大小。因此使用可伸縮圖片在這裡將排上用場了:可以移除“浪費”空間的圖片——iOS可 以重復利用。並且針對不同的元素(例如按鈕)不需要創建不同的圖片。
不過,使用圖片的話會失去代碼對圖片的控制能力,進而針對不同的程序,就需要重復的生成每一個需要的圖片,並反復的放到每個程序中。這個處理過程一 般會比較慢。另外一點就是如果你需要一個動畫,或者許多圖片都要進行輕微的調整(比如多個顏色的覆蓋),那麼需要在程序中加入許多圖片,進而增加了程序 bundle的大小。
總的來說,要考慮一下什麼才是最重要的:繪制性能還是程序大小。一般來說都重要,所以在同一個工程中,應該兩種都應考慮。
處理內存警告
當系統內存偏低時,iOS會通知所有在運行的程序。蘋果的官方文檔中介紹了如何處理低內存警告:
If your app receives this warning, it must free up as much memory as possible. The best way to do this is to remove strong references to caches, image objects, and other data objects that can be recreated later.
如果程序收到了低內存警告,在程序中必須盡量釋放內存。最佳方法就是移除強引用的涉及到的緩存,圖片對象,以及其它可以在之後使用時還可以重新創建的數據對象。
UIKit中提供了如下幾種方法來接收低內存(low-memory)警告:
實現app delegate中的applicationDidReceiveMemoryWarning: 方法。
在UIViewController子類中重寫(Override)didReceiveMemoryWarning方法。
在通知中心裡面注冊UIApplicationDidReceiveMemoryWarningNotificatio通知。
在收到以上任意的警告時,需要立即釋放任何不需要的內存。
例如,UIViewController的默認情況是清除掉當前不可見的view;在UIViewController的子類中,可以清除一些額外的數據。程序中不沒有顯示在當前屏幕中的圖片也可以release掉。
當收到低內存警告時,盡量釋放內存是非常重要的。否則,運行中的程序有可能會被系統殺掉。
不過,在清除內存時要注意一下:確保被清除的對象之後還可以被創建出來。另外,在開發程序的時候,請使用iOS模擬器中的模擬內存警告功能對程序進行測試!
以上就是小編為大家整理的增強iOS應用程序性能的文章,希望對大家有所幫助。