標籤:
1.避免過於龐大的XIB
當載入XIB的時候把所有的東西都放在了記憶體裡,包括任何的圖片;如果有一個不會即刻用到的view,就會浪費寶貴的記憶體資源了。
當載入一個引用了圖片或者聲音資源的nib時,nib載入代碼會把圖片和音效檔寫進記憶體。
2.不要阻塞主線程
UIKit在主線程上的所有工作,渲染,管理觸摸,回應輸入等都需要在上面完成。
將耗時操作放在子線程中。
3.在imageViews中調整圖片的大小
如果要在UIImageView中顯示一個來自bundle的圖片,你就應該保證圖片的大小和UIImageView的大小相同。在運行中縮放圖片是很耗費資源的,特別是UIImageView嵌套在UIScrollView中的情況下。
如果是從遠程伺服器載入,本地無法控製圖片的大小。應該在下載完成 後,最好用background thread,縮放一次,然後在UIImageView中使用縮放後的圖片。
4.選擇正確的collection
Arrays:有序的一組值。使用index來lookup很快,使用value lookup很慢,插入/刪除很慢。
Dictionaries:儲存索引值對。用值來尋找比較快。
Sets:無序的一組值。用值來尋找很快,插入/刪除很快。
5.重用或者消極式載入Views
如點擊一個按鈕需要呈現一個view的情境。
第一種:建立並隱藏這個view當這個screen載入的時候,當需要時顯示它。(更加耗記憶體)
第二各:當需要時才建立並展示。(比上一種慢)
6.Cache,Cache,還是Cache!
Cache所需要Cache的(也就是那些不大可能改變但是需要經常讀取的東西)
7.權衡渲染的方法
簡單來說,就是用事先渲染好的圖片更快一些,因為如此一來iOS就免去了建立一個圖片再畫東西上去然後顯示在螢幕上的程式。問題是你需要把所有你需要用到的圖片放到app的bundle裡面,這樣就增加了體積 – 這就是使用可變大小的圖片更好的地方了: 你可以省去一些不必要的空間,也不需要再為不同的元素(比如按鈕)來做不同的圖。
然而,使用圖片也意味著你失去了使用代碼調整圖片的機動性,你需要一遍又一遍不斷地重做他們,這樣就很浪費時間了,而且你如果要做一個動畫效果,雖然每幅圖只是一些細節的變化你就需要很多的圖片造成bundle大小的不斷增大。
總得來說,你需要權衡一下利弊,到底是要效能能還是要bundle保持合適的大小。
8.重用重大開銷對象
想要避免使用這個對象的瓶頸你就需要重用他們,可以通過添加屬性到你的class裡或者建立靜態變數來實現。
注意如果你要選擇第二種方法,對象會在你的app運行時一直存在於記憶體中,和單例(singleton)很相似。
9.避免反覆處理資料
比如需要資料來展示一個tableView,最好直播從伺服器取array結構的資料以避免的額外的中間資料結構改變。
如果需要從特定的key中取資料,那麼就使用索引值對的dictionary;
10.正確設定背影圖片
使用UIColor的colorWithPatternImage來設定背景色;
在view中添加一個UIImageView作為一個子View;
如果你使用全畫幅的背景圖,你就必須使用UIImageView因為UIColor的colorWithPatternImage是用來建立小的重複的圖片作為背景的。
如果你用小圖平鋪來建立背景,你就需要用UIColor的colorWithPatternImage來做了,它會更快地渲染也不會花費很多記憶體
11.最佳化Table View
正確使用reuseIdentifier來重用cells
盡量使所有的view opaque,包括cell自身
避免漸層,圖片縮放,後台選人
緩衝行高
如果cell內現實的內容來自web,使用非同步載入,緩衝請求結果
使用shadowPath來畫陰影
減少subviews的數量
盡量不適用cellForRowAtIndexPath:,如果你需要用到它,只用一次然後緩衝結果
使用正確的資料結構來儲存資料
盡量使用rowHeight, sectionFooterHeight 和 sectionHeaderHeight來設定固定的高,不要請求delegate
12.使用正確的資料存放區選項
使用NSUserDefaults(只能存一些小型資料,比如一些簡單的布爾型的設定選項)
使用XML,JSON或者plist(需要讀取檔案到記憶體裡去解析,這樣是很不經濟的)
NSCoding(也是檔案讀寫,也有上述問題)
Sqlite(可以儲存大資料)
13.加快啟動時間
儘可能做更多的非同步任務
避免使用龐大的XIB,因為他們是在主線程上載入,盡量使用Storyboards.(必須把裝置從Xcode斷開來測試啟動速度)
14.使用Autorelease Pool
建立多個臨時對象,發現記憶體一直減少,直到這些對象被release的時候,這是因為只有當autorelease pool的時候memory才會被釋放。
iOS開發之效能最佳化