iOS app性能提高

避免臃腫的XIB文件

故事板合瓢,由iOS5引進(jìn)市俊,很快的替代XIBs杨凑。

如果你專注使用XIBs,那么讓它們盡量的簡單摆昧。嘗試為一個試圖控制器創(chuàng)建一個XIB撩满,如果可能的話,把一個視圖控制器的視圖分層管理在單獨(dú)的XIBs中绅你。

注意當(dāng)你加載一個XIB到內(nèi)存的時候伺帘,它所有的內(nèi)容都會載入內(nèi)存,包括所有的圖片忌锯。如果你有視圖但不是要立即使用伪嫁,那你就浪費(fèi)了珍貴的內(nèi)存。值得注意的是這不會發(fā)生在故事板中偶垮,因?yàn)楣适掳嬷粫谛枰臅r候?qū)嵗粋€視圖控制器张咳。

當(dāng)你載入一個xib帝洪,所有的圖像文件會被緩存,如果是開發(fā)OSX脚猾,那么音頻文件也會被緩存葱峡。

調(diào)整圖像視圖中的圖像尺寸(縮放圖片會非常的耗時)

如果你用UIImageView呈現(xiàn)app束中的圖片時,確認(rèn)圖片和UIImageView的尺寸相同龙助∽逦郑縮放圖片會非常的耗時,特別是當(dāng)你的UIImageView被嵌入UIScrollView泌参。

如果圖片是從遠(yuǎn)程服務(wù)器上下載的脆淹,有時你沒法控制圖片尺寸,或者你不能在服務(wù)器上在下載之前縮放它沽一。在這些情況下你可以在圖片下載完成后手動縮放一次盖溺,最好是在后臺進(jìn)程中。然在UIImageView中使用調(diào)整尺寸之后的圖片铣缠。

重用大開銷對象

有的對象的初始化非常慢--NSDateFormatter和NSCalendar是兩個例子烘嘱,但是你不能避免使用它們,當(dāng)你從JSON/XML響應(yīng)中解析日期時蝗蛙。

避免使用這些對象時的性能瓶頸蝇庭,試著盡可能的重用這些對象。你可以加入你的類中成為一個屬性捡硅,也可以創(chuàng)建為靜態(tài)變量哮内。

注意如果你選擇了第二種方式,這個對象在app運(yùn)行的時候會一直保持在內(nèi)存里壮韭,像單例一樣北发。

同樣要記住設(shè)置一個NSDateFormatter的日期格式幾乎跟創(chuàng)建一個新的一樣慢。因此喷屋,如果在你的應(yīng)用中你頻繁需要處理多個日期格式琳拨,你的代碼應(yīng)該獲利于初始化創(chuàng)建,重用屯曹,多個NSDateFormatter對象狱庇。

選擇正確的數(shù)據(jù)存儲方式

當(dāng)要存儲和讀取大數(shù)據(jù)的時候你的選擇是什么?

你有一些選項(xiàng)恶耽,包括:

使用NSUserDefaults存儲它們密任。

存儲在結(jié)構(gòu)化文件中,XML驳棱,JSON批什,Plist格式中。

是用NSCoding打包社搅?

存儲在本地數(shù)據(jù)庫,如SQLite

使用NSData

NSUserDefaults有什么問題呢驻债?雖然說NSUserDefaults是好而且簡單乳规,它確實(shí)很好只有當(dāng)你有很少的數(shù)據(jù)要存(像你的等級,或者音量是開還是關(guān))合呐。一旦你接觸大數(shù)據(jù)暮的,會有更好的其他選擇。

保存在結(jié)構(gòu)化文件中也可能有問題淌实。一般的冻辩,在解析之前,你需要加載整個文件到內(nèi)存中拆祈,這是非常耗時的操作恨闪。你可以使用SAX去處理XML文件,但是那是一個復(fù)雜的作法放坏。同時你加載了全部的對象進(jìn)內(nèi)存咙咽,其中有你想要的也有不想要的。

那么NSCoding怎么樣呢?不幸的是淤年,它也同樣要讀寫文件,跟上面說的方法有同樣的問題钧敞。

你最好的解決方法是使用SQLite或者Core Data.通過這些技術(shù),你可以執(zhí)行特定的查詢只加載需要的對象,避免強(qiáng)力搜索方法來檢索數(shù)據(jù)麸粮。

重用和延遲加載視圖

越多的視圖就有越多的繪圖操作溉苛,最終意味著更多的CPU和內(nèi)存開銷。這說得特別對如果你的app嵌入很多視圖在UIScrollView時弄诲。

管理這個的技巧是去模擬UITableView和UICollectionView的行為:不要一次創(chuàng)建所有的子視圖愚战,而是在需要的時候創(chuàng)建,然后把他們假如重用隊(duì)列中威根。

這樣凤巨,你只需要在視圖浮動時配置你的視圖视乐,避免昂貴的資源分配開銷洛搀。

視圖創(chuàng)建的時機(jī)問題也同樣適用于你app的其他地方。試想當(dāng)你點(diǎn)擊一個button時呈現(xiàn)一個視圖的情景佑淀。至少有兩種方法:

1.屏幕第一次載入時創(chuàng)建視圖并隱藏它留美。當(dāng)你需要的時候,顯示出來伸刃。

2.需要呈現(xiàn)的時候一次創(chuàng)建視圖并顯示它谎砾。

每種方法都有各自的優(yōu)缺點(diǎn)

使用第一種方法,你消耗了更多內(nèi)存因?yàn)閺膭?chuàng)建開始到它釋放前你都保持了它的內(nèi)存捧颅,然而景图,當(dāng)你點(diǎn)擊button的時候,你的app會表現(xiàn)得響應(yīng)快速因?yàn)樗恍枰囊晥D的可視化屬性碉哑。

使用第二種方法會有相反的效果挚币,在需要的時候創(chuàng)建視圖亮蒋,消耗更少的內(nèi)存,但當(dāng)button被點(diǎn)擊時應(yīng)用會表現(xiàn)得不那么響應(yīng)快速妆毕。

啟用Gzip壓縮

大量和持續(xù)增長的app依賴從遠(yuǎn)端服務(wù)器或者外部APIs獲取的外部數(shù)據(jù)慎玖。某些時候你可能會開發(fā)一些需要下載XML,JSON笛粘,HTML或者其他文本格式的應(yīng)用趁怔。

問題是移動設(shè)備不能保證網(wǎng)絡(luò)環(huán)境,用戶可能一分鐘在邊緣網(wǎng)絡(luò)薪前,下一分鐘又是3G網(wǎng)絡(luò)润努,無論什么情況下,你不想你的用戶一直等待示括。

一個減少文件大小并加速下載的網(wǎng)絡(luò)資源的方法是同時在你的服務(wù)器和客戶端上使用GZIP壓縮任连,對于文本數(shù)據(jù)這種有高比率壓縮的數(shù)據(jù)來說非常有用。

好消息是iOS早已默認(rèn)支持GZIP壓縮例诀,如果你是使用NSURLConnection或者建立在這之上的框架比如AFNetworking随抠。更好的消息是一切云服務(wù)提供商像Google App Engine早已發(fā)送壓縮之后的響應(yīng)數(shù)據(jù)。

適當(dāng)?shù)脑O(shè)置背景圖片

像iOS編碼的其他工作一樣繁涂,至少有兩種不同方式去替換你視圖的背景圖片拱她。

你可以設(shè)置你的視圖的背景顏色為UIColor的colorWithPatternImage創(chuàng)建的顏色。

你可以添加一個UIImageView子試圖給View

如果你有全尺寸的背景圖片扔罪,你絕對要用UIImageView秉沼,因?yàn)閁IColor的colorWithPatternImage是重復(fù)的創(chuàng)建小的模式圖片,在這種情況下用UIImageView方式會節(jié)約很多內(nèi)存矿酵。

盡管如此唬复,如果你計劃用模式圖片背景,你應(yīng)該是用UIColor的colorWithPatternImage全肮。它更快一些敞咧,而且這種情況不會使用很多內(nèi)存。

優(yōu)化你的表格視圖

表格視圖需要快速的滾動辜腺,如果不能休建,用戶能確切注意到很滯后。

為了讓你的表格視圖流暢的滾動评疗,保證你實(shí)現(xiàn)了下列的建議测砂。

通過正確的reuseIdentifier重用cells

盡量多的設(shè)置views為不透明,包括cell本身百匆。

避免漸變砌些,圖像縮放,屏幕以外的繪制加匈。

如果行高不總是一樣存璃,緩存它們宙彪。

如果cell顯示的內(nèi)容來自網(wǎng)絡(luò),確保異步和緩存有巧。

使用shadowPath來建立陰影释漆。

減少子視圖的數(shù)目。

cellForRowAtIndexPath:中做盡量少的工作篮迎,如果需要做相同的工作男图,那么只做一次并緩存結(jié)果。

使用適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)存儲你要的信息甜橱,不同的結(jié)構(gòu)有對于不同的操作有不同的代價逊笆。

使用rowHeight,sectionFooterHeight岂傲,sectionHeaderHeight為常數(shù)难裆,而不是詢問代理。

減少你的網(wǎng)絡(luò)占用

UIWebView是非常有用的.它非常容易用來顯示web內(nèi)容镊掖,甚至創(chuàng)建你app的視窗乃戈。這些都是標(biāo)準(zhǔn)UIKit空間很難做到的。

盡管如此亩进,你可能注意你可以用在你的app中的UIWebView組件并沒有Apple的Safari app快症虑。這是Webkit’s的Nitro引擎的限制使用。

所以為了獲得最佳的性能归薛,你需要調(diào)整你的HTML谍憔。第一件事是盡可能多的避免Javascript,包括避免大的框架比如jQuery主籍。有時使用vanilla Javascript取代依賴的框架會快很多习贫。

隨時隨地遵循異步加載Javascript文件的實(shí)踐。特別當(dāng)它們不直接影響到頁面表現(xiàn)的時候千元,比如分析腳本苫昌。

最后,總是要意識到你在用的圖片诅炉,保持圖片的正確尺寸蜡歹。正如這個教程前面所提到的,利用精靈表的優(yōu)勢來節(jié)約內(nèi)存和提高速度涕烧。

加速啟動時間

App的啟動時間非常重要,特別是第一次啟動的時候汗洒。第一影響意味著太多了议纯!

最大的事情是保證你的App開始盡量的快,盡量的多的執(zhí)行異步任務(wù)溢谤,不如網(wǎng)絡(luò)請求瞻凤,數(shù)據(jù)庫訪問憨攒,或者數(shù)據(jù)解析。

盡量避免臃腫的XIBs阀参,因?yàn)槟阍谥骶€程中加載肝集。但是在故事板中不會有這個問題,所以盡量用它們蛛壳。

Note:監(jiān)察人不會運(yùn)行你的app在Xcode調(diào)試中,所以確保測試啟動性能時斷開與Xcode的連接杏瞻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市衙荐,隨后出現(xiàn)的幾起案子捞挥,更是在濱河造成了極大的恐慌,老刑警劉巖忧吟,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砌函,死亡現(xiàn)場離奇詭異,居然都是意外死亡溜族,警方通過查閱死者的電腦和手機(jī)讹俊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煌抒,“玉大人劣像,你說我怎么就攤上這事〈菝担” “怎么了耳奕?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诬像。 經(jīng)常有香客問我屋群,道長,這世上最難降的妖魔是什么坏挠? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任芍躏,我火速辦了婚禮,結(jié)果婚禮上降狠,老公的妹妹穿的比我還像新娘对竣。我一直安慰自己,他們只是感情好榜配,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布否纬。 她就那樣靜靜地躺著,像睡著了一般蛋褥。 火紅的嫁衣襯著肌膚如雪临燃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機(jī)與錄音膜廊,去河邊找鬼乏沸。 笑死,一個胖子當(dāng)著我的面吹牛爪瓜,可吹牛的內(nèi)容都是我干的蹬跃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼铆铆,長吁一口氣:“原來是場噩夢啊……” “哼蝶缀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起算灸,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扼劈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后菲驴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荐吵,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年赊瞬,在試婚紗的時候發(fā)現(xiàn)自己被綠了先煎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡巧涧,死狀恐怖薯蝎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谤绳,我是刑警寧澤占锯,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站缩筛,受9級特大地震影響消略,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瞎抛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一艺演、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桐臊,春花似錦胎撤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至懒浮,卻和暖如春飘弧,著一層夾襖步出監(jiān)牢的瞬間识藤,已是汗流浹背砚著。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工次伶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稽穆。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓冠王,卻偏偏與公主長得像,于是被迫代替她去往敵國和親舌镶。 傳聞我的和親對象是個殘疾皇子柱彻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

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

  • 當(dāng)我們開發(fā)iOS應(yīng)用時,好的性能對我們的App來說是很重要的餐胀。你的用戶也希望如此哟楷,但是如果你的app表現(xiàn)的反應(yīng)遲鈍...
    iOS開發(fā)攻城獅閱讀 1,527評論 0 14
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,135評論 25 707
  • 大三寒假,不像大部分同學(xué)去找實(shí)習(xí)否灾,沈小姐把整個假期都拿來讀閑書了卖擅。直到開學(xué)后聽著身邊的朋友都在聊實(shí)習(xí)中的各種收獲,...
    沈問之閱讀 1,350評論 2 1
  • 心情像書桌一樣雜亂 心緒似光陰一般空虛 在人來人往的熙熙攘攘中 我墨技, 既學(xué)不會迎合奉承 也做不了強(qiáng)顏歡笑 于是惩阶, ...
    南之南落小雪閱讀 180評論 2 3
  • 深夜崭别,收到阿然的微信:“姐冬筒,我和梅子分手了,說到底茅主,還是因?yàn)槲腋F舞痰。”微信那頭一米八被我戲稱肌肉男的阿然暗膜,哭得像個剛...
    安若Jane閱讀 269評論 0 2