避免臃腫的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的連接杏瞻。