在開(kāi)發(fā)當(dāng)中我自己用到的最多的肯定是斷點(diǎn)調(diào)試了,但是強(qiáng)大的Xcode顯然不止這么一點(diǎn)調(diào)試優(yōu)化工具,這篇文章就用來(lái)記錄并分享我用的幾種方法:【本文持續(xù)更新凑懂,歡迎大家提出寶貴建議】
一膘螟、斷點(diǎn)調(diào)試
【1.普通斷點(diǎn)】斷點(diǎn)(Breakpoint)絕對(duì)是調(diào)試程序的第一大選擇,也是掌握的基礎(chǔ)技能枚荣。顧名思義,當(dāng)程序運(yùn)行到斷點(diǎn)處時(shí)會(huì)暫停運(yùn)行啼肩。比如斷點(diǎn)打在11行橄妆,那么程 序就會(huì)停在11行(注意:程序只運(yùn)行到了前10行,第11行其實(shí)還沒(méi)有被執(zhí)行F碜埂:δ搿!)赦拘。只要在代碼行旁邊點(diǎn)擊慌随,就能添加一個(gè)斷點(diǎn),再次點(diǎn)擊躺同,就能讓斷點(diǎn)不 可用(disable了阁猜,仍然存在,只是不起作用了)蹋艺。在某一行創(chuàng)建斷點(diǎn)的快捷鍵是:command+\
并能在調(diào)試過(guò)程中在下方看到參數(shù)的值:
注意:斷點(diǎn)調(diào)試中還有一個(gè)經(jīng)常用到的命令是po剃袍,用來(lái)打印對(duì)象信息
【2.條件斷點(diǎn)】以上的斷點(diǎn)只是最普通的,我們還能對(duì)斷點(diǎn)的屬性進(jìn)行配置捎谨,設(shè)置條件民效,使斷點(diǎn)更加智能化,右鍵斷點(diǎn)進(jìn)入編輯對(duì)話框:
我以一個(gè)循環(huán)作為測(cè)試代碼:
循環(huán)中的代碼每次都要單步執(zhí)行涛救,可能這并不是我想要的畏邢。我想要在i為3的時(shí)候中斷程序,進(jìn)行調(diào)試检吆,編寫(xiě)條件如下:
設(shè)置i==3的條件后舒萎,程序就會(huì)在該條件時(shí)中斷,而不會(huì)每次到達(dá)該位置都中斷咧栗。中斷時(shí)輸出如下:
同時(shí)也可以設(shè)置Ignore參數(shù)逆甜,會(huì)忽略前面n次的斷點(diǎn)運(yùn)行,會(huì)在第n+1次中斷致板。
調(diào)試輸出如下:
同時(shí)交煞,還可以查看某個(gè)函數(shù)被調(diào)用的次數(shù),設(shè)置Action參數(shù)如下斟或,注意要選中Automatically continue after evaluating actions.
輸出結(jié)果如下:
【3.異常斷點(diǎn)】斷點(diǎn)的功能不限于上面所述素征。開(kāi)發(fā)iOS知道,如果我們因?yàn)楫惓H缓蟪绦騝rash了,代碼就直接跑到main.m的main函數(shù)中去了御毅。為什么就不能跑到出現(xiàn)異常的代碼中呢根欧??端蛆?異常斷點(diǎn)就為我們解決該問(wèn)題凤粗,程序就會(huì)在異常出現(xiàn)的那行代碼終止。創(chuàng)建異常斷點(diǎn)圖例如下:
如下所示就創(chuàng)建完成了今豆。如果碰到異常crash時(shí)嫌拣,嘗試使用異常斷點(diǎn)吧。
【4.符號(hào)斷點(diǎn)Symbolic Breakpoint】符號(hào)斷點(diǎn)的創(chuàng)建也同異常斷點(diǎn)呆躲。一般符號(hào)斷點(diǎn)可以在你指定的[類(lèi)名 方法名]時(shí)中斷執(zhí)行异逐。【創(chuàng)建方法如上圖】
配置符號(hào)斷點(diǎn)如下:可以當(dāng)執(zhí)行到ViewController類(lèi)的viewDidLoad方法時(shí)中斷執(zhí)行插掂。
如果你的Symbol只寫(xiě)了一個(gè)函數(shù)名灰瞻,那么就會(huì)在出現(xiàn)該函數(shù)名的地方就中斷執(zhí)行。如下辅甥,就會(huì)在運(yùn)行到doAnimation的時(shí)候中斷酝润。是不是很強(qiáng)大呢?
以上為斷點(diǎn)調(diào)試璃弄,歡迎大家補(bǔ)充指正袍祖,下面介紹另外的幾種調(diào)試:
二、視圖調(diào)試
如今iOS開(kāi)發(fā)的UI設(shè)計(jì)有很多種方式谢揪,比如storyboard,xib捐凭,代碼實(shí)現(xiàn)拨扶。對(duì)于stoayboard,xib可視化實(shí)現(xiàn)是比較簡(jiǎn)單的, 但是對(duì)于一些“iOS老程序員”而言茁肠,都喜歡使用代碼實(shí)現(xiàn)UI患民,并且可能UI層次還比較復(fù)雜。這樣就給我們新接手項(xiàng)目的開(kāi)發(fā)者帶來(lái)很多困擾垦梆。如何快速查看 一個(gè)復(fù)雜UI的界面層次和布局匹颤,最快的方法就是用到視圖調(diào)試。
當(dāng)項(xiàng)目運(yùn)行到某一個(gè)界面(可以是模擬器或真機(jī))時(shí)托猩,開(kāi)啟視圖調(diào)試印蓖,點(diǎn)擊按鈕如圖:這樣就會(huì)進(jìn)入試圖調(diào)試,你可以很方便的查看這個(gè)界面京腥。這里可以看到控件之間的層次關(guān)系赦肃。
左側(cè)的樹(shù)形層次圖可以在查看線程、隊(duì)列和UI之間切換:
可以通過(guò)選中左側(cè)控件名稱(chēng)就可以在右側(cè)看到控件的位置【藍(lán)色加深部分】,只要控件存在大小他宛,并且已經(jīng)添加到視圖范圍內(nèi)船侧,就會(huì)在右側(cè)顯示。
三厅各、僵尸對(duì)象
iOS中把那些已經(jīng)release但還沒(méi)完全消失的對(duì)象叫做僵尸對(duì)象镜撩,對(duì)已經(jīng)release的對(duì)象再次釋放,就會(huì)發(fā)生異常队塘。雖然自從使用ARC后袁梗, 由于對(duì)象釋放產(chǎn)生的異常已經(jīng)大大變少,但偶爾還會(huì)出現(xiàn)人灼。開(kāi)啟僵尸對(duì)象模式后围段,就能快速定位到異常位置。開(kāi)啟方式如 下:Product-->Scheme-->Edit Scheme.. 勾選Enable Zombie Objects即可投放。
這里再加一個(gè)工具就是Analyze分析器奈泪,Analyze分析器是一種靜態(tài)的工具,可以對(duì)我們的程序進(jìn)行分析灸芳,找出我們未使用的變量涝桅,或一些死存儲(chǔ)。執(zhí)行Analyze如下:Product-->Analyze. 如下藍(lán)色的標(biāo)記就是靜態(tài)分析的結(jié)果烙样。
當(dāng)然冯遂,我們可以設(shè)置在編譯程序的時(shí)候同時(shí)Analyze,把下列選項(xiàng)設(shè)為Yes即可谒获。
但是我一般不這么做蛤肌,可能是寫(xiě)代碼習(xí)慣的問(wèn)題吧,我通常是寫(xiě)完了之后再使用分析器分析批狱,不僅可以分析出哪里的變量未使用裸准,還可以分析出哪里可能為空造成異常,打開(kāi)分析器快捷鍵command + shift + b
四赔硫、Instruments中l(wèi)eaks工具調(diào)試內(nèi)存泄漏
【1.leaks工具】Instruments這個(gè)里面的工具真的太牛了炒俱,我目前也只掌握了兩種,以后還有會(huì)用的會(huì)再到這里更新爪膊。
靜態(tài)分析器Analyze并不能分析出代碼里所有的內(nèi)存問(wèn)題权悟,比如說(shuō)有時(shí)候內(nèi)存泄漏是在用戶(hù)操作的時(shí)候才產(chǎn)生的,這個(gè)時(shí)候就需要用到leaks工具來(lái)進(jìn)行調(diào)試了推盛,可以在這里找到Instruments
打開(kāi)后是這個(gè)樣子
先選中leaks然后點(diǎn)擊choose就可以打開(kāi)了烛缔,打開(kāi)后是這樣:
這里的意思是在iPhone7 plus上運(yùn)行你的工程進(jìn)行測(cè)試住册,可能你第一次打開(kāi)那里選擇的 my mac脖阵,你可以像選擇模擬器一樣的點(diǎn)擊選擇你要的設(shè)備拍屑,這里不要選真機(jī)荷辕,否則你會(huì)看不到你的代碼!件豌!無(wú)法修改疮方,回歸正題,這里選好了設(shè)備和工程之后點(diǎn)擊紅色的點(diǎn)運(yùn)行茧彤,像正常操作一樣把每一個(gè)步驟都實(shí)驗(yàn)一下骡显,如果你看到Allocations那行有出現(xiàn)紅色菱形就代表那一塊有內(nèi)存泄露了。這個(gè)時(shí)候點(diǎn)擊停止按鈕
然后下一步就可以看代碼了:
你只要在這些方法上雙擊曾掂,就會(huì)跳轉(zhuǎn)到具體的代碼惫谤,進(jìn)入到代碼去之后會(huì)這樣:
這里應(yīng)該是提示100%內(nèi)存會(huì)泄露。所以就著重在這里查代碼了珠洗,因?yàn)閮?nèi)存泄漏可能會(huì)很大程度的影響程序的穩(wěn)定性A锿帷!
【2.Time Profiler工具】
Time Profiler分析原理:它按照固定的時(shí)間間隔來(lái)跟蹤每一個(gè)線程的堆棧信息许蓖,通過(guò)統(tǒng)計(jì)比較時(shí)間間隔之間的堆棧狀態(tài)蝴猪,來(lái)推算某個(gè)方法執(zhí)行了多久,并獲得一個(gè)近似值膊爪。其實(shí)從根本上來(lái)說(shuō)與我們的原始分析方法異曲同工自阱,只不過(guò)其將各個(gè)方法消耗的時(shí)間統(tǒng)計(jì)起來(lái),同樣是從Instruments中打開(kāi)米酬。
選擇Time Profiler工具開(kāi)始測(cè)試沛豌,這時(shí)會(huì)自動(dòng)啟動(dòng)模擬器和Time Profiler錄制。先進(jìn)行一些App的操作赃额,讓Time Profiler收集足夠的數(shù)據(jù)加派,尤其是你覺(jué)得那些有性能瓶頸的地方。
4跳芳、5哼丈、6所標(biāo)記的面板是需要關(guān)注的:
4是擴(kuò)展面板,用來(lái)跟蹤顯示堆棧筛严;5是詳細(xì)地面板,可以從這里看到cpu運(yùn)行的時(shí)間都消耗在哪里饶米;6是選項(xiàng)面板桨啃,可以用來(lái)設(shè)置Time Profiler的運(yùn)行參數(shù)。
通過(guò)對(duì)應(yīng)用的操作檬输,可以在詳細(xì)面板中看到那些最耗時(shí)的操作是哪些照瘾,并可以逐行展開(kāi)查看:
圖標(biāo)為黑色頭像的就是Time Profiler給我們的提示,有可能存在性能瓶頸的地方丧慈,可以逐漸向下展開(kāi)析命,找到產(chǎn)生的根本原因主卫。
比如我們通過(guò)分析,發(fā)現(xiàn)[CMTool getNewsTimeFromLong]這個(gè)時(shí)間格式化函數(shù)可能需要優(yōu)化鹃愤。
當(dāng)然這里只是舉一個(gè)例子簇搅,性能調(diào)優(yōu)應(yīng)該首先從整體到細(xì)節(jié)的順序進(jìn)行,才能收到最明顯的效果软吐。Time Profiler參數(shù)設(shè)置:
這里邊幾個(gè)選項(xiàng)的含義如下:
Separate by Thread: 每個(gè)線程應(yīng)該分開(kāi)考慮瘩将。只有這樣你才能揪出那些大量占用CPU的"重"線程
Invert Call Tree:
從上倒下跟蹤堆棧,這意味著你看到的表中的方法,將已從第0幀開(kāi)始取樣,這通常你是想要的,只有這樣你才能看到CPU中話費(fèi)時(shí)間最深的方法.也就是說(shuō)FuncA{FunB{FunC}}
勾選此項(xiàng)后堆棧以C->B-A 把調(diào)用層級(jí)最深的C顯示在最外面
Hide Missing Symbols: 如果dSYM無(wú)法找到你的app或者系統(tǒng)框架的話,那么表中看不到方法名只能看到十六進(jìn)制的數(shù)值,如果勾線此項(xiàng)可以隱藏這些符號(hào),便于簡(jiǎn)化數(shù)據(jù)
Hide System Libraries: 勾選此項(xiàng)你會(huì)顯示你app的代碼,這是非常有用的. 因?yàn)橥ǔD阒魂P(guān)心cpu花在自己代碼上的時(shí)間不是系統(tǒng)上的
Show Obj-C Only: 只顯示oc代碼 ,如果你的程序是像OpenGl這樣的程序,不要勾選側(cè)向因?yàn)樗锌赡苁荂++的
Flatten Recursion: 遞歸函數(shù), 每個(gè)堆棧跟蹤一個(gè)條目
Top Functions:
一個(gè)函數(shù)花費(fèi)的時(shí)間直接在該函數(shù)中的總和,以及在函數(shù)調(diào)用該函數(shù)所花費(fèi)的時(shí)間的總時(shí)間凹耙。因此姿现,如果函數(shù)A調(diào)用B,那么A的時(shí)間報(bào)告在A花費(fèi)的時(shí)間加上B花費(fèi)的時(shí)間,這非常真有用肖抱,因?yàn)樗梢宰屇忝看蜗碌秸{(diào)用堆棧時(shí)挑最大的時(shí)間數(shù)字备典,歸零在你最耗時(shí)的方法。
上面的參數(shù)在實(shí)踐中合理設(shè)置意述,也沒(méi)有什么太多技巧提佣,就是通過(guò)數(shù)據(jù)的隱藏、顯示讓我們更關(guān)注于想找到的數(shù)據(jù)欲险。
目前先就寫(xiě)這些吧镐依,寫(xiě)這篇文章只是想把我平時(shí)看到的一些知識(shí)以及自己的一些體會(huì)通過(guò)這樣的方式集中整理復(fù)習(xí)一下,這樣以后會(huì)更加方便熟練天试。
instruments調(diào)試部分參照自:http://www.cnblogs.com/ym123/p/4324335.html
其中斷點(diǎn)調(diào)試部分參照自:http://www.cnblogs.com/gongyuhonglou/p/5806433.html