高性能iOS開發(fā)讀書筆記

老司機高德納曾經(jīng)說過:程序開發(fā)人員為提升程序效率在錯誤的方向和時間點浪費了太多的時間移必,過早優(yōu)化是編程領域的萬惡之源

1.內(nèi)存優(yōu)化
一個應用中內(nèi)存消耗分成兩個部分:一個是棧空間一個是堆空間。
椂梗空間:每一個線程都會對應一個專用的棧空間幻件,棧空間可以在線程存在期間使用蛔溃,但是有最大棧空間限制篱蝇。如果超出這個限制贺待,將會導致棧移除,程序被殺死零截。
以下幾種情況麸塞,都是由于棧空間溢出涧衙,導致程序被殺死:

  • 可以被遞歸調(diào)用的最大方法數(shù)目哪工。因為每一個方法都會對應一個棧幀奥此,棧幀會消耗一定字節(jié)的內(nèi)存。(這就是為什么雁比,循環(huán)調(diào)用一定會崩潰稚虎,因為函數(shù)棧幀消耗的字節(jié)數(shù)太多,導致內(nèi)存溢出)
  • 方法中定義的變量個數(shù)太多偎捎。當然這只是一個理論上可能會導致棧溢出的情況蠢终,實際開發(fā)中基本不會因為定義過多變量被系統(tǒng)kill掉
  • 視圖的層級太深。遞歸的調(diào)用layoutSubviews方法跟drawRect方法茴她。
    堆空間:每一個進城的所有線程都是會對應同一個堆空間寻拂。堆空間是系統(tǒng)分配的。通過類創(chuàng)建的對象相關的所有數(shù)據(jù)都是放在堆中的丈牢。所以重量級model在系統(tǒng)收到didReceiveMemoryWarning的時候進行清空祭钉,然后在必要的時候重新賦值對于系統(tǒng)優(yōu)化是非常必要的。

內(nèi)存管理的原則

  • 你可以擁有你自己創(chuàng)建的對象己沛,比如 new,alloc,copy,mutablecopy
  • 你可以使用MRC中的retain 或者是ARC中的_Strong來標示對一個對象的強引用
  • 在MRC中當不需要一個對象的時候慌核,需要使用release方法來釋放對象的持有關系,ARC中不需要做任何操作

避免循環(huán)引用引發(fā)的內(nèi)存泄漏
1.delegate weak修飾
2.__weak 修飾被block捕獲的局部變量
3.NSTimer泛粹,對象持有定時器遂铡,定時器也持有對象。解決方法1.自定義清理時機晶姊,可以退出控制器時扒接,也可以點擊某一個按鈕時。

2.能耗
基本沒什么好說的们衙,無關緊要
3.多線程
記准卣:主線程用來更新UI,自線程用來做讀寫文件等比較耗時的操作
每個線程大概會消耗1KB的內(nèi)核內(nèi)存空間蒙挑。主線程會占用1MB的椬谡欤空間,子線程會占用512KB的椧涫矗空間矾利。
多線程的弊端:

  • 上下文切換,耗費時間
  • 創(chuàng)建耗費時間馋袜,一般一條線程創(chuàng)建之后啟動大概耗費29毫秒
    三種多線程的比較
    1.GCD
  • 抽象程度高
  • 兩種隊列開箱即用:main和global
  • 可以創(chuàng)建更多的隊列
  • 硬性要求少于64個線程

2.NSOperationQueue

  • 無默認隊列
  • 應用管理自己創(chuàng)建的隊列
  • 隊列是優(yōu)先級的隊列
  • 操作可以有不同的優(yōu)先級
  • 使用cancel可以取消操作
  • 可以等待某個操作執(zhí)行完成

屬性默認實用的是atomic男旗,但是這樣做屬性也不一定是線程安全的。如果需要做線程安全操作欣鳖,更好的是用鎖察皇。所以不要將屬性設置為atomic。
注意:@synchronized指令會拖慢應用的運行速度泽台,因為在任何時間內(nèi)都只有一個線程在臨界區(qū)什荣。
以下是三種比較常用的鎖
1.NSLock
這是一種低級別的鎖矾缓,一旦獲得了鎖,那么將會執(zhí)行臨界區(qū)中的內(nèi)容稻爬,并且不會超過一個線程執(zhí)行嗜闻。釋放鎖則標志著臨界區(qū)結(jié)束。有個注意點就是 釋放鎖的操作一定要跟加鎖操作在同一線程因篇。
2.NSRecursiveLock
在調(diào)用lock之前泞辐,NSLock必須先調(diào)用unlock。但是正如名字暗示的那樣竞滓,NSRecursiveLock允許在被解鎖之前鎖定多次咐吼。只要解鎖的次數(shù)跟鎖定的次數(shù)相匹配,那么鎖就可以釋放商佑。

image.png

上圖是各種鎖的性能锯茄。附上老司機的關于iOS中鎖問題研究文章鏈接:https://bestswifter.com/ios-lock/

4.應用的首次啟動時間
應用首次啟動往往會做很多事情,包括
1.加載默認項
2.檢查測試版本
3.初始化應用標識符
4.初始化崩潰報告
5.建立分析方法
6.建立UI基礎框架
7.建立內(nèi)存緩存
附上 今日頭條開機啟動優(yōu)化的文章:http://www.cocoachina.com/ios/20170208/18651.html

5.UI層面的優(yōu)化
記住下面幾個原則

  • 盡量減少主線程中的工作
  • 避免視圖層級中的多層嵌套
  • 盡可能的延遲視圖的加載茶没,也就是常說的懶加載肌幽。并且對于可以重用的視圖,進行復用 https://github.com/facebookarchive/AsyncDisplayKit
  • UIImageView 注意分場景下使用imageNamed跟imageWithContentsofFile抓半。使用圖片與imageView大家接近喂急,避免imageview對圖片縮放操作。
  • UITableView的優(yōu)化:http://www.reibang.com/p/4780b10dae55
  • 慎用自動布局笛求。自動布局在視圖比較多的時候非常耗費CPU性能廊移。如果頁面元素太多,建議使用原生的frame布局探入,對于提升幀率有非常大的幫助狡孔。當然了marsory對于計算布局有非常大的幫助,往往很復雜的約束蜂嗽,frame要寫一大堆代碼苗膝,但是marsory就可以寫幾行就可以了。根據(jù)業(yè)務不同植旧,可以自己做選擇辱揭。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市病附,隨后出現(xiàn)的幾起案子问窃,更是在濱河造成了極大的恐慌,老刑警劉巖胖喳,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贮竟,居然都是意外死亡丽焊,警方通過查閱死者的電腦和手機较剃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來技健,“玉大人写穴,你說我怎么就攤上這事〈萍” “怎么了啊送?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長欣孤。 經(jīng)常有香客問我馋没,道長,這世上最難降的妖魔是什么降传? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任篷朵,我火速辦了婚禮,結(jié)果婚禮上婆排,老公的妹妹穿的比我還像新娘声旺。我一直安慰自己,他們只是感情好段只,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布腮猖。 她就那樣靜靜地躺著,像睡著了一般赞枕。 火紅的嫁衣襯著肌膚如雪澈缺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天鹦赎,我揣著相機與錄音谍椅,去河邊找鬼。 笑死古话,一個胖子當著我的面吹牛雏吭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陪踩,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼杖们,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肩狂?” 一聲冷哼從身側(cè)響起摘完,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎傻谁,沒想到半個月后孝治,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年谈飒,在試婚紗的時候發(fā)現(xiàn)自己被綠了岂座。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡杭措,死狀恐怖费什,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情手素,我是刑警寧澤鸳址,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站泉懦,受9級特大地震影響稿黍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜祠斧,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一闻察、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧琢锋,春花似錦辕漂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鲸阻,卻和暖如春跋涣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸟悴。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工陈辱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人细诸。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓沛贪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親震贵。 傳聞我的和親對象是個殘疾皇子利赋,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349

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

  • 從三月份找實習到現(xiàn)在,面了一些公司猩系,掛了不少媚送,但最終還是拿到小米、百度寇甸、阿里塘偎、京東疗涉、新浪、CVTE吟秩、樂視家的研發(fā)崗...
    時芥藍閱讀 42,213評論 11 349
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,799評論 25 707
  • Java8張圖 11博敬、字符串不變性 12、equals()方法峰尝、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,696評論 0 11
  • 曾經(jīng)的我收恢,認為 教師武学,是為人師表、無私奉獻伦意、人類文明的階梯的代名詞 醫(yī)生火窒,是救死扶傷的代名詞 現(xiàn)在的我,認為 不管...
    廢柴少爺閱讀 485評論 0 0
  • 不知不覺驮肉,又到了中午十二點熏矿。吃午飯的時間到了,饑餓的人紛紛坐到了餐桌周圍离钝。 飯菜端上來了票编,還是一如既往的米飯,大家...
    上官飛鴻閱讀 351評論 7 20