總的來說,你需要考慮一下什么才是最重要的:繪制性能還是程序大小。一般來說都重要,所以在同一個工程中,應該兩種都應考慮。
12) 處理內存警告
當系統內存偏低時,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模擬器中的模擬內存警告功能對程序進行測試!
13) 重用花銷很大的對象有些對象的初始化非常慢——比如NSDateFormatter和NSCalendar。不過有時候可以避免使用這些對象,例如在解析JSON/XML中的日期時。
當使用這些對象時,為了避免性能上的瓶頸,可以嘗試盡量重用這些對象——在類中添加一個屬性或者創建一個靜態變量。
注意,如果使用靜態變量的話,對象會在程序運行的時候一直存在,就像單例一樣。
下面的代碼演示創建一個延遲加載的日期格式屬性。第一次調用屬性的時候,會創建一個新的日期格式。之后再調用的話,會返回已經創建好的實例對象:
// in your .h or inside a class extension@property (nonatomic, strong) NSDateFormatter *formatter; // inside the implementation (.m)// When you need, just use self.formatter- (NSDateFormatter *)formatter { if (! _formatter) { _formatter = [[NSDateFormatter alloc] init]; _formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy"; // twitter date format } return _formatter;}
另外,還需要記住的是在設置NSDateFormatter的日期格式時,同樣跟創建新的一個NSDateFormatter實例對象時一樣慢!因此,在程序中如果需要頻繁的處理日期格式,那么對NSDateFormatter進行重用是非常好的。
14) 使用Sprite Sheets
使用sprite sheets
你是一個游戲開發者嗎?是的話那么sprite sheets是最佳選擇之一。使用Sprite sheets跟常用的繪制方法比起來,繪制更快,并且消耗更少的內存。
下面是兩個非常不錯的sprite sheets教程:
如何在Cocos2D中使用動畫和Sprite Sheets
如何在Cocos2D中使用紋理包(Texture Packer)和像素格式來創建并優化Sprite Sheets
第二個教程詳細的介紹了像素格式——在游戲中可以衡量性能的影響。
如果你還不熟悉sprite sheets,那么可以看看這里的介紹:SpriteSheets – 視頻, Part 1and Part 2. 這兩個視頻的作者是Andreas Löw, 他是紋理包(Texture Packer)的創建者, 紋理包是創建sprite sheets的重要工具。
除了使用sprite sheets外,這里還介紹了一些用于游戲開發中的技巧,例如,如果你有很多sprite(比如射擊類游戲中),那么可以重用sprite,而不用每次都創建sprite。
15) 避免重新處理數據
許多程序都需要從遠程服務器中獲取數據,以滿足程序的需求。這些數據一般是JSON或XML格式。在請求和接收數據時,使用相同的數據結構非常重要。
為什么呢?在內存中把數據轉換為適合程序的數據格式是需要付出額外代價的。
例如,如果你需要在table view中顯示一些數據,那么請求和接收的數據格式最好是數組格式的,這樣可以避免一些中間操作——將數據轉換為適合程序使用的數據結構。
類似的,如果程序是根據鍵來訪問具體的值,那么最好請求和接收一個鍵/值對字典。
在第一時間獲得的數據就是所需要格式的,可以避免將數據轉換為適合程序的數據格式帶來的額外代價。
16) 選擇正確的數據格式
選擇正確的數據格式
將數據從程序傳到網絡服務器中有多種方法,其中使用的數據格式基本都是JSON和XML。你需要做的就是在程序中選擇正確的數據格式。
JSON的解析速度非???,并且要比XML小得多,也就意味著只需要傳輸更少數據。并且在iOS5之后,已經有內置的JSON反序列化API了,所以使用JSON是很容易的。
不過XML也有它自己的優勢:如果使用SAX方法來解析XML,那么可以邊讀XML邊解析,并不用等到全部的XML獲取到了才開始解析,這與JSON是不同的。當處理大量數據時,這種方法可以提升性能并減少內存的消耗。
17) 設置適當的背景圖片