菜鳥(niǎo)教程——iOS性能優(yōu)化

1,計(jì)算代碼運(yùn)行時(shí)間:相信數(shù)據(jù),不要太相信感覺(jué)。不過(guò)要注意模擬器和真機(jī)的差異。

2,善用性能分析工具。

XCode 自帶了很多強(qiáng)大的分析工具,包括靜態(tài) Analyze 工具,以及運(yùn)行時(shí) Profile 工具。

3,關(guān)于圖片

優(yōu)先使用[UIImage imageNamed:@""];

與[[UIImage alloc]?initWithContentsOfFile:] 和?[UIImage alloc [initWithData:]] 相比,[UIImage imageNamed:]有著更好的效率,這是因?yàn)?iOS 會(huì)自帶 cache 通過(guò)?[UIImage imageNamed:] 載入的圖像,但該方法有一個(gè)缺點(diǎn),那就是只能載入應(yīng)用程序 bundle 中的圖像,像網(wǎng)絡(luò)下載的圖像就無(wú)能無(wú)力了。我習(xí)慣的做法是自定義一個(gè) ImageCache 類(lèi),自己來(lái) cache 圖像。

盡量不要使用全屏大小的背景圖片;使用 gradient?圖片來(lái)取代硬編碼的 gradient;gradient 圖片應(yīng)當(dāng)盡可能窄,然后將之拉伸運(yùn)用到實(shí)際場(chǎng)合中去。

4,對(duì)于結(jié)構(gòu)復(fù)雜的 View,使用 drawRect 自繪而不是從 nib 中載入。

5,對(duì)于 TableView,重用 cell;減少 cell 初始化的工作量,延遲裝載;定制復(fù)雜 cell 時(shí),使用 drawRect 自繪;Cache 盡可能多的東西,包括 cell 高度;盡可能讓 cell 不透明;避免使用圖像特性,比如 gradients。

6,在線程中使用 autoreleasepool。

7,將一些不太重要的任務(wù)放在 idle 時(shí)運(yùn)行。

8,不要在 viewWillAppear 中做費(fèi)時(shí)的操作。

viewWillAppear: 在 view 顯示之前被調(diào)用,出于效率考慮,在這個(gè)方法中不要處理復(fù)雜費(fèi)時(shí)的事情;只應(yīng)該在這個(gè)方法設(shè)置 view 的顯示屬性之類(lèi)的簡(jiǎn)單事情,比如背景色,字體等。要不然,用戶(hù)會(huì)明顯感覺(jué)到 view 顯示遲鈍。

9,使用多線程來(lái)延遲加載資源。比如常見(jiàn)的 TableViewCell 中的網(wǎng)絡(luò)圖像顯示,先使用一個(gè)默認(rèn)圖像,然后開(kāi)啟線程下載網(wǎng)絡(luò)圖像,當(dāng)圖像下載完成之后,再替換默認(rèn)圖像。

10,關(guān)于后臺(tái)任務(wù)

系統(tǒng)進(jìn)入 background 之后,一般只有10分鐘的運(yùn)行時(shí)間,因此有很多值得注意的事項(xiàng):

a) 盡量減少內(nèi)存的使用。當(dāng)內(nèi)存不足時(shí),iOS將kill那些消耗內(nèi)存最多的 App。

b) 釋放所有的共享資源,比如?Calendar 與 Address book。當(dāng)應(yīng)用程序進(jìn)入后臺(tái)時(shí),如果它還在使用或沒(méi)有釋放共享資源,iOS會(huì)立即kill掉該應(yīng)用程序。

c) 正確處理App生命周期事件。當(dāng)進(jìn)入后臺(tái)時(shí),應(yīng)該保持應(yīng)用程序數(shù)據(jù),以便回到前臺(tái)時(shí)能夠恢復(fù)。當(dāng)進(jìn)入 inactive 狀態(tài)時(shí),應(yīng)該暫停當(dāng)前的業(yè)務(wù)流。iOS運(yùn)行App在后臺(tái)運(yùn)行的時(shí)間有限,因此后臺(tái)代碼不應(yīng)該執(zhí)行非常耗時(shí)的任務(wù),可能的話就使用多線程。當(dāng)進(jìn)入后臺(tái) 時(shí),iOS會(huì)保存當(dāng)前App的一個(gè)快照,以便之后在合適的時(shí)候(裝載view和數(shù)據(jù)時(shí))呈現(xiàn)給用戶(hù)以提高用戶(hù)體驗(yàn),因此在進(jìn)入后臺(tái)時(shí),應(yīng)該避免在屏幕上呈 現(xiàn)用戶(hù)信息,以免泄露用戶(hù)個(gè)人資料。

d) 不要更新UI或者執(zhí)行大量消耗CPU或電池的代碼。進(jìn)入后臺(tái)之后,不應(yīng)該執(zhí)行不必要的任務(wù),不要執(zhí)行 OpenGL ES 調(diào)用,應(yīng)取消 Bonjour 相關(guān)的服務(wù),正確處理網(wǎng)絡(luò)鏈接失敗,避免更新 UI,清除所有的警告或其他彈出對(duì)話框。

e) 保證后臺(tái)代碼的執(zhí)行工作正常,注意處理異常。

f) 在后臺(tái)時(shí)正確響應(yīng)系統(tǒng)變化。?如: 設(shè)備旋轉(zhuǎn)消息UIDeviceOrientationDidChangeNotification ,重要的時(shí)間變化(新的一天開(kāi)始或時(shí)區(qū)變化)UIApplicationSignificantTimeChangeNotification ,電池變化UIDeviceBatteryLevelDidChangeNotification 和 UIDeviceBatteryStateDidChangeNotification,用戶(hù)默認(rèn)設(shè)置變化 NSUserDefaultsDidChangeNotification,本地化語(yǔ)言變化 NSCurrentLocaleDidChangeNotification 等。

11,如果關(guān)鍵代碼使用 C/C++/asm 效率更高就使用 C/C++/asm。

12,如果一個(gè)方法在一個(gè)循環(huán)次數(shù)非常多的循環(huán)中使用,在進(jìn)入循環(huán)前使用 methodForSelector?獲取該方法 IMP,然后在循環(huán)體中直接使用該 IMP。

13,關(guān)于內(nèi)存釋放

在?didReceiveMemoryWarning 中釋放內(nèi)存,比如cache 的圖像,view 等,并記得調(diào)用 [supper didReceiveMemoryWarning]。清理函數(shù)?didReceiveMemoryWarning, viewDidUnload 和 dealloc 都是在方法結(jié)尾處調(diào)用 supper 的方法。

14,提高 APP 加載速度

避免使用靜態(tài)初始化,包括靜態(tài)c++對(duì)象,加載時(shí)會(huì)運(yùn)行的代碼,如+(void) load{} ,會(huì)造成在Main函數(shù)之前運(yùn)行額外的代碼。

16,利用 cache 空間換時(shí)間。cache 是一種常見(jiàn)的空間換時(shí)間的提供性能的收到,可以用在相當(dāng)多的場(chǎng)合。

盡量 cache 那些可重復(fù)利用的對(duì)象,比如 table cell,date/number formatters,正則表達(dá)式,sqlite語(yǔ)句等。

17,關(guān)于數(shù)據(jù)庫(kù)

緩存經(jīng)常用到的 sqlite 語(yǔ)句;優(yōu)化數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)句,用sqlite3_trace和sqlite3_profile來(lái)查找性能差的語(yǔ)句;如果可能的話,緩存查詢(xún)結(jié)果緩。

在使用?sqlite_prepare會(huì)將SQL查詢(xún)編譯成字節(jié)碼,要使用bind,重用那些已經(jīng)prepared的語(yǔ)句。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,415評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,104評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,884評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,647評(píng)論 6 408
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,130評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,366評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,887評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,737評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,939評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,174評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,586評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,827評(píng)論 1 283
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,608評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,914評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容