iOS App 整體性能優(yōu)化

性能優(yōu)化是一個大的問題,所以首先是需要把這個問題分而化之,把它分解成一個個影響app性能的小問題才能進(jìn)行回答,所以在這里做出一些整理來回答這個問題,同時也提醒自己再次遇到如此大的問題時學(xué)會分析問題的本身以及從哪些方面去回答這些問題榨乎。
影響app性能的幾個問題有:

1. 網(wǎng)絡(luò)性能

網(wǎng)絡(luò)性能優(yōu)化涉及到DNS解析,路由算法棠涮,以及服務(wù)器端性能谬哀,不是很了解,可參看一下文章:
攜程App的網(wǎng)絡(luò)性能優(yōu)化實踐
影響移動應(yīng)用網(wǎng)絡(luò)性能的三大因素

2. 內(nèi)存問題

在MRC時代严肪,手動釋放內(nèi)存會導(dǎo)致大量內(nèi)存的泄露史煎。但是在ARC時代解決了大部分的內(nèi)存泄露,但是仍然會出現(xiàn)內(nèi)存泄露的問題:

1. 循環(huán)引用
2. Core Animation對象手動釋放
3. UIWebView內(nèi)存泄露

一些詳細(xì)介紹如下:
ARC下的內(nèi)存泄漏
ARC 下內(nèi)存泄露的那些點

3. 主線程阻塞

所有的用戶輸入和UIKit的渲染是在主線程執(zhí)行驳糯。所以要保證app的流暢度就一定不能阻塞主線程篇梭,把可以在子線程中做的事放到子線程中來減少主線程的計算與處理。
假如在主線程中執(zhí)行如下操作:

1. 網(wǎng)絡(luò)同步請求
2. I/O操作
3. 大量運(yùn)算
4. 解壓縮
...

因為需要處理的多所以會阻塞主線程酝枢,導(dǎo)致卡頓恬偷,因此要減少主線程中耗時的操作,使用多線程(NSThread帘睦、NSOperationQueue, GCD)來處理這些袍患。可以查看OS X 和 iOS 中的多線程技術(shù)關(guān)于多線程的介紹竣付。還有主線程關(guān)于渲染的處理會影響效率诡延,所以這一塊也是需要處理的。

4. Offscreen rendering(離屏渲染)

離屏渲染古胆,指的是GPU在當(dāng)前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進(jìn)行渲染操作肆良。離屏渲染意味著你App的部分區(qū)域每一幀渲染了兩次。所以會造成一定的性能損失逸绎。
對于UIView或者CALayer的frame,bounds,transform等屬性的改變惹恃,消耗的資源遠(yuǎn)大于他們其他的屬性改變。
可以參考以下文章:
繪制像素到屏幕上
繪制陰影引發(fā)的 iOS 繪圖性能問題總結(jié)
iOS 離屏渲染的研究

5. 圖片的處理

通常會用imageNamed:來加載mainbundle中的圖片棺牧,此函數(shù)會緩存加載的image巫糙。因此,對于那些被重用的圖片陨帆,這個API很高效曲秉。但是對于那些使用很少的圖片采蚀,用這個就很耗內(nèi)存疲牵。
所以在加載使用一次的應(yīng)用圖片時使用initWithContentsOfFile:函數(shù)承二,而在加載多次使用的圖片時就使用imageNamed:函數(shù)。例如加載引導(dǎo)頁的圖片時使用載入路徑的方式纲爸,而使用通用的背景圖的就使用imageNamed:的方式亥鸠。

//使用路徑方式載入圖片
NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:fileType]; 
UIImage *image = [[UIImage alloc] initWithContentsOfFile:path];  

//使用圖片名的方式載入圖片
UIImage *image = [UIImage imageNamed:fileName];  

//讀取本地圖片的 和imageNamed一樣,但是性能比后者要強(qiáng)很多识啦,兩個參數(shù)负蚊,前面一個是 文件名,后面一個是類型
#define LoadImage(_pointer) [UIImage imageNamed:[UIUtil imageName:_pointer]] //可以用來直接傳圖片名字
#define LoadImageWithType(file,ext) [UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:file ofType:ext]]

一般的優(yōu)化技術(shù)就是在減少內(nèi)存使用颓哮,減少主線程業(yè)務(wù)處理家妆,用空間來換時間等等,基于這些策略及技術(shù)考慮來選擇優(yōu)化方向冕茅。
以下是iOS的一些細(xì)節(jié)優(yōu)化策略

  • 避免對UIView使用透明伤极。(UIView默認(rèn)是非透明)。原因是透明對性能要求較高姨伤,如果在滾動時頁面比較復(fù)雜哨坪,體驗上的差異會相對明顯。
  • 避免過于龐大的xib乍楚。(如果不得不使用一個ViewController作為xib,也應(yīng)該將其其中的子視圖拆成小的xib)当编。
    需要注意的是,當(dāng)你加載一個XIB的時候所有內(nèi)容都被放在了內(nèi)存里徒溪,包括任何圖片忿偷。如果有一個不會即刻用到的view,你這就是在浪費寶貴的內(nèi)存資源了臊泌。Storyboards就是另一碼事兒了鲤桥,storyboard僅在需要時實例化一個view controller.
    不要阻塞主線程。
  • 使圖片符合UIImageView的尺寸缺虐。不要在運(yùn)行的時候再讓UIImageView自行壓縮芜壁,因為這樣會降低運(yùn)行時的性能。(注:手動壓縮圖片的方法高氮,在context中使用drawInRect)
  • 選擇合適的collection慧妄,數(shù)據(jù)結(jié)構(gòu)決定了算法的效率。 如:Array使用下標(biāo)查找較快剪芍,但插入和刪除較慢塞淹。set進(jìn)行插入和刪除很快。
  • 使用緩存罪裹,因為數(shù)據(jù)具有時效的饱普,所以對于時效性要求不高的數(shù)據(jù)完全可以使用緩存來保證快速顯示运挫。例如URL對應(yīng)的圖片緩存(SDWebImage),通過數(shù)據(jù)庫活core Data來保存不需要變動的數(shù)據(jù)套耕,UIWeb的緩存等都屬于這種谁帕。
  • 處理低內(nèi)存警告。在收到內(nèi)存警告時冯袍,清除對cache的強(qiáng)引用匈挖,沒有當(dāng)前顯示需要的image,以及一些其他可以再創(chuàng)建的對象康愤。
  • 重用一些高消耗的對象儡循,如NSDateFormatter、NSCalender等征冷。解決方法:可以將其作為property择膝、甚至是靜態(tài)變量作為單例在APP中使用。并且检激,NSDateFormatter的 setDateFormate也是非常消耗資源的一個操作肴捉。
  • 網(wǎng)絡(luò)傳輸過來的數(shù)據(jù),往往是json或xml字符串呵扛。直接將這些字符串轉(zhuǎn)換成我們需要的數(shù)據(jù)結(jié)構(gòu)(自定義類或者NSDictionary),避免后續(xù)使用的時候還要做數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換產(chǎn)生不必要的消耗每庆。
  • 設(shè)置UIView的背景圖片時,如果是整幅圖今穿,就采用addSubView一個UIImageView缤灵;如果是要重復(fù)平鋪一個小圖,就使用colorWithPatternImage蓝晒,因為這個函數(shù)的設(shè)計上就是針對小圖的腮出,如果用于整幅大圖來做背景,反而會消耗更多內(nèi)存芝薇。
  • 在臨時創(chuàng)建大量對象時胚嘲,使用NSAutoreleasepool,例如洛二,一個循環(huán)用于創(chuàng)建包含多個對象的數(shù)組馋劈,在循環(huán)體內(nèi),即可使用@autoreleasepool包裹創(chuàng)建代碼晾嘶。使用系統(tǒng)的@autoreleasepool會有延遲妓雾,內(nèi)存不會馬上釋放。
  • 對于排版復(fù)雜的文字或者圖文混排垒迂,使用CoreText技術(shù)械姻。(而不是一味地堆UILabel)
  • 在對渲染的效率要求較高的頁面中,避免使用UILabel机断、UITextView等在主線程中進(jìn)行排版和繪制的控件楷拳。應(yīng)自定義文本控件绣夺,用TextKit或者CoreText進(jìn)行文本異步繪制舆逃。另外酝陈,還有facebook的AsyncDisplayKit框架可以采用。
    將繪制圖像放在次線程中執(zhí)行奋渔,如在次線程中使用 CGContext進(jìn)行畫圖浸颓,在主線程中 layer.contents = img物臂。
    圖片和視圖的大小避免超過4096*4096旺拉,因為這是目前iphone5到iphone6p以及ipad僅僅通過GPU就直接處理的紋理尺寸上限产上,否則就GPU就會提交CPU先處理,這樣開銷很大蛾狗。
  • 減少視圖或者layer的層級數(shù)量晋涣,在有多個層級時,可以將多圖合并成一張圖沉桌,再渲染顯示谢鹊。
  • 電量消耗:減少耗電與流量的操作。GPS在獲取用戶位置之后留凭,就進(jìn)行關(guān)閉佃扼,因為它非常耗電。
  • 關(guān)于后臺運(yùn)行蔼夜。進(jìn)入后臺后兼耀,即盡量減少內(nèi)存占用、釋放所有的共享資源(如Calender或address book)求冷,因為iOS會kill后臺中內(nèi)存消耗最多的或者進(jìn)入后臺還占用共享資源的進(jìn)程瘤运。

參考文章:
iOS App性能優(yōu)化
讓App的運(yùn)行速度與響應(yīng)速度趨于一流
程序猿進(jìn)化必讀:讓App的運(yùn)行速度與響應(yīng)速度趨于一流(iOS)
iOS應(yīng)用性能調(diào)優(yōu)的4個建議和技巧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市匠题,隨后出現(xiàn)的幾起案子拯坟,更是在濱河造成了極大的恐慌,老刑警劉巖韭山,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郁季,死亡現(xiàn)場離奇詭異,居然都是意外死亡钱磅,警方通過查閱死者的電腦和手機(jī)梦裂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來续搀,“玉大人塞琼,你說我怎么就攤上這事〗希” “怎么了彪杉?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵毅往,是天一觀的道長。 經(jīng)常有香客問我派近,道長攀唯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任渴丸,我火速辦了婚禮侯嘀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谱轨。我一直安慰自己戒幔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布土童。 她就那樣靜靜地躺著诗茎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪献汗。 梳的紋絲不亂的頭發(fā)上敢订,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音罢吃,去河邊找鬼楚午。 笑死,一個胖子當(dāng)著我的面吹牛尿招,可吹牛的內(nèi)容都是我干的矾柜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼泊业,長吁一口氣:“原來是場噩夢啊……” “哼把沼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吁伺,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤饮睬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后篮奄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捆愁,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年窟却,在試婚紗的時候發(fā)現(xiàn)自己被綠了昼丑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡夸赫,死狀恐怖菩帝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤呼奢,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布宜雀,位于F島的核電站,受9級特大地震影響握础,放射性物質(zhì)發(fā)生泄漏辐董。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一禀综、第九天 我趴在偏房一處隱蔽的房頂上張望简烘。 院中可真熱鬧,春花似錦定枷、人聲如沸孤澎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亥至。三九已至,卻和暖如春贱迟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背絮供。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工衣吠, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人壤靶。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓缚俏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贮乳。 傳聞我的和親對象是個殘疾皇子忧换,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,732評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件向拆、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,058評論 4 62
  • 有的時候亚茬,選擇比努力重要!一個好的選擇可能比你努力一百天更有效浓恳!可是刹缝,有了好的選擇,不努力颈将,卻又是萬萬行不通的梢夯,只...
    亨謙閱讀 179評論 0 2
  • 里面包含了證書創(chuàng)建、上線前的資料填寫等等一套完整的流程晴圾。 http://blog.csdn.net/zgxiaoj...
    湘郎閱讀 325評論 0 0
  • 題綱: db.collection.find()/findOne() 問與答 問: 有辦法查詢字段值為null的文...
    螞蟻閑游閱讀 346評論 0 0