iOS應(yīng)用程序中UITableView的性能優(yōu)化(最全面)

由于iOS設(shè)備的限制突硝,想處理好應(yīng)用程序中的性能是一件難事特铝。我們在開發(fā)過程中會有很多地方是需要注意的祭衩,當(dāng)然也很容易在做出選擇時忘記考慮性能影響嚼摩。

對tableView的優(yōu)化:

UITableView作為iOS開發(fā)中最重要的控件之一,為了獲得更好的滑動性能,我們可以采取以下的措施:

·正確使用`reuseIdentifier`來重用cells

·盡量使所有的view opaque钦讳,包括cell自身

·如果cell內(nèi)現(xiàn)實(shí)的內(nèi)容來自web,使用異步加載枕面,緩存請求結(jié)果

·避免漸變愿卒,圖片縮放

·使用`shadowPath`來畫陰影

·緩存行高

·減少subviews的數(shù)量

·盡量不適用`cellForRowAtIndexPath:`,如果你需要用到它潮秘,只用一次然后緩存結(jié)果

·使用正確的數(shù)據(jù)結(jié)構(gòu)來存儲數(shù)據(jù)

·盡量少于或者不用透明圖層

以下是詳細(xì)的介紹:

1琼开、在應(yīng)用程序中正確的地方使用:ReuseIdentifier

我們在開發(fā)中常見的錯誤就是沒有給UITableViewCells,UICollectionViewCells枕荞,甚至是UITableViewHeaderFooterViews設(shè)置正確的reuseIdentifier柜候。

在優(yōu)化性能時,table view用`tableView:cellForRowAtIndexPath:`為rows分配cells的時候躏精,它的數(shù)據(jù)應(yīng)該重用自UITableViewCell渣刷。一個table view維持一個隊列的數(shù)據(jù)可重用的UITableViewCell對象。當(dāng)然如果不使用reuseIdentifier的話玉控,每顯示一行table view就需要設(shè)置全新的cell飞主。這樣一來對應(yīng)用程序性能的影響非常的大,特別會使app的滾動體驗(yàn)大大的降低高诺。

從iOS6起碌识,除了對UICollectionView的cells和補(bǔ)充views,也應(yīng)該在header和footer views中使用reuseIdentifiers虱而,使用reuseIdentifiers的話筏餐,在一個table view中添加一個新的cell時在data source 方法中添加這個方法:

staticNSString*ID =@"MyCell";

UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:ID];

這個方法可以把那些已經(jīng)存在的cell從隊列中排除,或者在必要時使用先前注冊的nib或者class創(chuàng)造新的cell牡拇。如果沒有可重用的cell魁瞪,也沒有注冊一個class或者nib的話,這個方法就會返回nil惠呼。

2导俘、在開發(fā)的過程中要盡量把Views設(shè)置為透明色:

如果應(yīng)用中有透明的Views我們應(yīng)該設(shè)置它們的opaque屬性為YES。

其原因是這樣會使系統(tǒng)用一個最優(yōu)的方式渲染這些views剔蹋。這個屬性在IB或者代碼里都可以設(shè)定旅薄。

Apple的文檔對于為圖片設(shè)置透明屬性的描述是:

(opaque)這個屬性給渲染系統(tǒng)提供了一個如何處理這個view的提示。如果設(shè)為YES泣崩,渲染系統(tǒng)就認(rèn)為這個view是完全不透明的少梁,這使得渲染系統(tǒng)優(yōu)化一些渲染過程和提高性能。如果設(shè)置為NO矫付,渲染系統(tǒng)正常地和其它內(nèi)容組成這個View凯沪。默認(rèn)值是YES。

在相對比較靜止的畫面中买优,設(shè)置這個屬性不會有太大影響妨马。然而當(dāng)這個view嵌在scroll view里邊,或者是一個復(fù)雜動畫的一部分杀赢,不設(shè)置這個屬性的話會在很大程度上影響app的性能烘跺。所以我們可以在模擬器中用Debug\Color Blended Layers選項(xiàng)來發(fā)現(xiàn)哪些view沒有被設(shè)置為opaque。目標(biāo)就是葵陵,能設(shè)為opaque的就全設(shè)為opaque!

3液荸、在ImageView中調(diào)整圖片的大小:

如果要在`UIImageView`中顯示一個來自bundle的圖片脱篙,你應(yīng)保證圖片的大小和UIImageView的大小相同娇钱。在運(yùn)行中縮放圖片是很耗費(fèi)資源的,特別是`UIImageView`嵌套在`UIScrollView`中的情況下绊困。

如果圖片是從遠(yuǎn)端服務(wù)加載的你不能控制圖片大小文搂,比如在下載前調(diào)整到合適大小的話,你可以在下載完成后秤朗,最好是用background thread煤蹭,縮放一次,然后在UIImageView中使用縮放后的圖片。

4硝皂、選擇正確的數(shù)據(jù)格式:

從app和網(wǎng)絡(luò)服務(wù)間傳輸數(shù)據(jù)有很多方案常挚,最常見的就是JSON和XML。如果讓我們選擇對app來說最合適的一個稽物,那么解析JSON會比XML更快一些奄毡,JSON也通常更小更便于傳輸。從iOS5起就有了官方內(nèi)建的JSON deserialization就更加方便使用了贝或。

但是使用XML也有XML的好處吼过,比如使用SAX來解析XML就像解析本地文件一樣,我們不需像解析json一樣等到整個文檔下載完成才開始解析咪奖,那么當(dāng)我們處理很大的數(shù)據(jù)的時候就會極大地減低內(nèi)存消耗和增加性能盗忱。

XML的解析方式:

①DOM解析:是將文檔一次性全部下載到本地在按節(jié)點(diǎn)進(jìn)行解析,這樣對我們的應(yīng)用程序的內(nèi)存消耗極大羊赵,手機(jī)本身的內(nèi)存就不是很大趟佃,不像電腦那樣有很大的內(nèi)存,可見這種解析方式不太適用于手機(jī)慷垮,即手機(jī)無法直接使用 DOM 的方式來解析 XML揖闸;

②SAX解析:是一種只讀的方式,在文檔中按照節(jié)點(diǎn)從上之下的方式來進(jìn)行解析料身,是蘋果提供的解析方式汤纸,雖然節(jié)點(diǎn)是一次性讀取的,但是節(jié)點(diǎn)中的內(nèi)容是多次讀取的芹血,這種解析方式的速度相當(dāng)?shù)目熘ⅲ梢杂肗SXMLParser通過代理方法來實(shí)現(xiàn)解析;

SAX解析方式的步驟:

①開始文檔—準(zhǔn)備工作

②開始"節(jié)點(diǎn)"

③發(fā)現(xiàn)節(jié)點(diǎn)內(nèi)部的內(nèi)容幔烛,每一個節(jié)點(diǎn)啃擦,可能都需要多次解析才能完成

④結(jié)束"節(jié)點(diǎn)"

⑤結(jié)束文檔—解析結(jié)束

以上步驟,②饿悬、③令蛉、④會不斷循環(huán),一直到所有的解析完成狡恬。

5珠叔、避免反復(fù)處理數(shù)據(jù):

我們的應(yīng)用需要從服務(wù)器加載所需的常用的JSON或者XML格式的數(shù)據(jù)。在服務(wù)器端和客戶端使用相同的數(shù)據(jù)結(jié)構(gòu)很重要弟劲。在內(nèi)存中操作數(shù)據(jù)使它們滿足我們的數(shù)據(jù)結(jié)構(gòu)開銷很大的祷安。

譬如我們需要數(shù)據(jù)來展示一個table view,最好直接從服務(wù)器取array結(jié)構(gòu)的數(shù)據(jù)以避免額外的中間數(shù)據(jù)結(jié)構(gòu)改變。相似的兔乞,如果需要從特定key中取數(shù)據(jù)汇鞭,那么就使用鍵值對的dictionary凉唐。


如果以上總結(jié)有欠缺的地方,請大神多多指教.

github: iOS_愚非愚余 歡迎star..? ? ??


參考iOS開發(fā)進(jìn)階,感謝xiao66guo;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市霍骄,隨后出現(xiàn)的幾起案子台囱,更是在濱河造成了極大的恐慌,老刑警劉巖腕巡,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玄坦,死亡現(xiàn)場離奇詭異血筑,居然都是意外死亡绘沉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門豺总,熙熙樓的掌柜王于貴愁眉苦臉地迎上來车伞,“玉大人,你說我怎么就攤上這事喻喳×砭粒” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵表伦,是天一觀的道長谦去。 經(jīng)常有香客問我,道長蹦哼,這世上最難降的妖魔是什么鳄哭? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮纲熏,結(jié)果婚禮上妆丘,老公的妹妹穿的比我還像新娘。我一直安慰自己局劲,他們只是感情好勺拣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鱼填,像睡著了一般药有。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苹丸,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天愤惰,我揣著相機(jī)與錄音,去河邊找鬼谈跛。 笑死羊苟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的感憾。 我是一名探鬼主播蜡励,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼令花,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凉倚?” 一聲冷哼從身側(cè)響起兼都,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稽寒,沒想到半個月后扮碧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杏糙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年慎王,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宏侍。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡赖淤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谅河,到底是詐尸還是另有隱情咱旱,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布绷耍,位于F島的核電站吐限,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏褂始。R本人自食惡果不足惜霍比,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一策橘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦棠众、人聲如沸划乖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至幅慌,卻和暖如春宋欺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胰伍。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工齿诞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骂租。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓祷杈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渗饮。 傳聞我的和親對象是個殘疾皇子但汞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

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