iOS各種調(diào)試技巧豪華套餐

摘自iOS界段子小王子http://www.cnblogs.com/daiweilai/p/4421340.html
抽刀斷Bug
斷點(diǎn)勋拟,(我求你們不要想到張敬軒携添,阿軒他容易么昧穿,小受又怎么了寇甸?你們這幫人真是的T鱿浴!)涨享,我要說(shuō)的斷點(diǎn)是BreakPoint筋搏!基本上不是殘廢的IDE都具有斷點(diǎn)調(diào)試功能吧!尤其是XCode厕隧,我們家的IDE斷點(diǎn)調(diào)試功能可是強(qiáng)中又是強(qiáng)中手奔脐!在這之前大家可以先了解一下哈子是斷點(diǎn)?它怎么實(shí)現(xiàn)的吁讨?工作原理怎么樣的髓迎?博主就獻(xiàn)丑說(shuō)說(shuō)自己的理解吧,斷點(diǎn)建丧,顧名思義就是從前有一個(gè)點(diǎn)排龄,后來(lái)它斷了,謝謝茶鹃,我的故事講完了涣雕。哎喲還不服艰亮,這些基礎(chǔ)常識(shí)的東西自己不會(huì)查?你還真的臉皮厚上天了去了挣郭,還要博主給你查喲迄埃,自己查去!
普通操作
如圖3


基本的斷點(diǎn)操作如下
圖4

點(diǎn)擊那個(gè)黑列列就創(chuàng)建了一個(gè)斷點(diǎn)兑障,再次點(diǎn)擊就臨時(shí)取消這個(gè)斷點(diǎn)(但是不刪除)侄非,長(zhǎng)按那個(gè)斷點(diǎn)拖出去就刪除了(mac os的系統(tǒng)工程師就是稀飯拖動(dòng)的快感),當(dāng)然也可以右鍵那個(gè)創(chuàng)建的斷點(diǎn)流译,會(huì)彈出相應(yīng)地菜單逞怨。當(dāng)然也還可以監(jiān)視某個(gè)變量!圖5

在對(duì)象視圖中福澡,右鍵某個(gè)對(duì)象叠赦,點(diǎn)擊“Watch ‘XXX’”就完成XXX對(duì)象的監(jiān)視了。
這里我監(jiān)視了lab這個(gè)UILabel的變量革砸,每當(dāng)這個(gè)變量進(jìn)行更新它的信息就會(huì)被打印到控制臺(tái)除秀。好吧!我們最基本的創(chuàng)建斷點(diǎn)的工作已經(jīng)學(xué)會(huì)了算利,Xcode舒服在什么地方呢册踩?就是不分Debug模式和Run模式的,可以說(shuō)是無(wú)縫切換的效拭,你只要沒(méi)有創(chuàng)建斷點(diǎn)暂吉,那么就是Run的正常模式,如果創(chuàng)建了斷點(diǎn)并且運(yùn)行到斷點(diǎn)處缎患,就自動(dòng)進(jìn)入Debug模式咯慕的,不像某EC開(kāi)頭的IDE,控制面板就像開(kāi)飛機(jī)的一樣挤渔,幾萬(wàn)個(gè)按鈕以為很強(qiáng)大业稼,其實(shí)只用了Run和Stop张肾,還有什么Debug模式俭尖,App模式……苛萎,果然Xcode的優(yōu)越感在對(duì)比中更加強(qiáng)烈了,舒服到極點(diǎn)呀骡楼,就像夏天的海風(fēng)拂過(guò)菊花,嗯是的 就是那種感覺(jué)稽鞭!我們創(chuàng)建好了斷點(diǎn)鸟整,運(yùn)行到斷點(diǎn)就自動(dòng)停下來(lái)了,像這樣:圖6

這些Debug的最基本操作技能是每一個(gè)入門(mén)的iOS開(kāi)發(fā)者都要掌握的朦蕴,應(yīng)該當(dāng)成一種本能篮条,就像狗愛(ài)吃翔一樣(噢 對(duì)不起 博主不是歧視狗的意思弟头,博主也養(yǎng)過(guò)狗,很二逼但是從不吃翔涉茧!真的據(jù)我所知它從來(lái)不吃翔的赴恨,這里只是比喻只是比喻)。

全局?jǐn)帱c(diǎn)(Global BreakPoint)
有時(shí)候在程序出錯(cuò)的時(shí)候不能能準(zhǔn)確定位到奔潰的那一行代碼,而是直接跑到main循環(huán)或者Appdelegate里面伴栓, 或者會(huì)給你這樣的提示:
EXEC_BAD_ACCESS:

是不是有種想哭的沖動(dòng)伦连?尼瑪至少給我一些堆棧信息也好呀……這個(gè)時(shí)候你千萬(wàn)不要砸鼠標(biāo)和鍵盤(pán)哦,一切都是主機(jī)在運(yùn)行钳垮,你砸鼠標(biāo)和鍵盤(pán)有什么用呢惑淳?應(yīng)該是踢主機(jī)呀,現(xiàn)在有了全局?jǐn)帱c(diǎn)饺窿,娘親再也不擔(dān)心你砸鼠標(biāo)了歧焦,你只需要這樣:圖7


在Debug導(dǎo)航面板進(jìn)行上圖的操作,你就建立了全局?jǐn)帱c(diǎn)肚医,這樣只要遇到錯(cuò)誤绢馍,debug程序就會(huì)自動(dòng)定位到棧底的信息,也就是你最先出錯(cuò)的代碼的那一行忍宋,這樣你就可以快樂(lè)的debug拉

條件斷點(diǎn)(Condational Breakpoints)
從前有一個(gè)游戲痕貌,叫做擼啊擼,有些玩家他們知道怎么操作糠排,會(huì)放技能會(huì)走路舵稠,但是他們不知道買(mǎi)裝備,玩了一局下來(lái)入宦,鞋子小刀都沒(méi)有買(mǎi)哺徊。我為什么講這個(gè)故事呢?因?yàn)楹芏嘈∨笥褜W(xué)東西和玩游戲一樣乾闰,看完前面的幾種調(diào)試技能落追,就以為自己已經(jīng)屌爆無(wú)敵了,其實(shí)他們不過(guò)是出門(mén)不帶裝備的玩家涯肩,如果只是使用了以上的調(diào)試技能只能說(shuō)是低玩轿钠,在高大的逼優(yōu)雞面前根本就是會(huì)被瞬秒的那種,所以學(xué)會(huì)裝備自己才是王道病苗!條件斷點(diǎn)疗垛,就是學(xué)會(huì)有的放矢!
我們來(lái)看一段代碼圖8



你是不是想問(wèn)博主為何那么風(fēng)騷硫朦,竟然上了Swift了4蟆!我此刻只想吟一首濕:別人笑我太淫蕩,我家住在黃鶴樓泽裳。反正這個(gè)年代大家都是吃飽了撐著的瞒斩,博主也是,所以就學(xué)學(xué)Swift咯涮总。我們?nèi)绻谝粋€(gè)循環(huán)里面使用了斷點(diǎn)胸囱,如果這個(gè)循環(huán)執(zhí)行了100萬(wàn)次,那你的斷點(diǎn)要執(zhí)行那么多次妹卿,你不覺(jué)得蛋蛋都涼了的憂傷么旺矾?所以我們這么做:圖9



這樣只有遍歷到c==“H”的時(shí)候 斷點(diǎn)才會(huì)被觸發(fā)。
圖10

是不是很棒呢夺克!有些童鞋的鈦合金狗眼已經(jīng)看到了編輯斷點(diǎn)那里有一個(gè)Action的東西箕宙,那是什么呢?這個(gè)是非常強(qiáng)大的铺纽,可以在你斷點(diǎn)的位置柬帕,執(zhí)行各種操作,比如執(zhí)行腳本命令狡门,控制臺(tái)命令(可以制定調(diào)試信息自定義保存)陷寝、打印信息等,博主最喜歡的就是這個(gè)Log message啦其馏,簡(jiǎn)單粗暴凤跑!根本就不需要print啊NSLog嘛,直接在斷點(diǎn)的Action打印就好了(其實(shí)這個(gè)是Xcode和調(diào)試器結(jié)合的高能產(chǎn)物叛复,下面再介紹)仔引。具體可以這樣:圖11

其實(shí)剛剛博主撒謊了,博主最喜歡的Action并不是Log Message褐奥,而是Sound咖耘,顧名思義嘛,斷點(diǎn)射在Bug上撬码,這樣遇到斷點(diǎn)就會(huì)發(fā)出聲音儿倒,聽(tīng)到我自己設(shè)置的聲音,我就知道是什么Bug了呜笑,聽(tīng)聲識(shí)Bug夫否,呵呵,EXEC_BAD_ACCESS的錯(cuò)誤我設(shè)置成了波多野老師的聲音叫胁,unrecognized selector send to instancd的錯(cuò)誤我設(shè)置成了蒼老師的…… 不要問(wèn)我系統(tǒng)怎么沒(méi)有吉澤明步的聲音慷吊,我根本就不知道誰(shuí)是吉澤明步。
當(dāng)然還有更加強(qiáng)大的條件斷點(diǎn)就是這貨啦圖12



添加之后在 Symbol 一欄輸入 viewDidLoad曹抬。這樣一來(lái),在程序中所有的 viewDidLoad 方法被調(diào)用時(shí)都會(huì)觸發(fā)斷點(diǎn)。圖13
當(dāng)然谤民,我們也可以?xún)H僅為特定的某個(gè)類(lèi)的方法添加斷點(diǎn)堰酿。在 Symbol 一欄輸入 [ClassName viewDidLoad] (Objective-C) 或 ClassName.viewDidLoad (Swift) 即可。比如:unrecognized selector sent to instance 0xaxxxx 這種錯(cuò)誤张足,這個(gè)instance可以這樣快速定位圖14

打印的藝術(shù)
盡管ARC已經(jīng)讓內(nèi)存管理變得簡(jiǎn)單触创、省時(shí)和高效,但是在object的life-cycles中跟蹤一些重要事件依然十分重要为牍。畢竟ARC并沒(méi)有完全排除內(nèi)存泄露的可能性哼绑,或者試圖訪問(wèn)一個(gè)被release的對(duì)象。為了這個(gè)目的碉咆,我們可以很藝術(shù)地偷窺對(duì)象正在做些什么抖韩,想想就好有快感。
NSLog
小伙伴們第一節(jié)課學(xué)習(xí)ViewController的生命周期的時(shí)候疫铜,老師肯定很猥瑣的教了大家茂浮,在viewController的每個(gè)生命周期的方法中使用了NSLog來(lái)偷窺!沒(méi)錯(cuò)壳咕,這樣其實(shí)就是最簡(jiǎn)單爆炸的跟蹤生命周期的方法了席揽,不過(guò)系統(tǒng)自己的NSLog真心有點(diǎn)羸弱,輸出的信息太少谓厘,根本就不能滿足我們的欲望幌羞,這里我教大家強(qiáng)化你的Log!竟稳!可以用下面的這段宏
//A better version of NSLog#define NSLog(format, ...) do { \fprintf(stderr, "<%s : %d> %s\n", [[[NSString stringWithUTF8String:FILE] lastPathComponent] UTF8String], _LINE_, func); (NSLog)((format), ##VA_ARGS); \fprintf(stderr, "-------\n"); } while (0)

關(guān)于宏的威力 大家可以亂入我的博文《 iOS中的預(yù)編譯指令的初步探究》這樣打印出來(lái)的東西才像話嘛(其實(shí)NSLog的打印是非常低效的属桦,甚至比print低100倍,感興趣自己翻翻蘋(píng)果手冊(cè)咯)住练。 使用objc語(yǔ)言(強(qiáng)類(lèi)型)并且用NSLog打印的時(shí)候地啰,常常搞不清楚NSLog(@“%?”,xxx) xxx這種類(lèi)型該是什么什么類(lèi)型輸出,應(yīng)該是%d呢還是%@亦或是%f讲逛?亏吝??傻傻分不清楚~盏混,所以玩轉(zhuǎn)NSLog你應(yīng)該要知道以下這幾個(gè)全局方法蔚鸥!圖17


開(kāi)啟僵尸對(duì)象(Enable NSZombie Objects)
Xcode可以把那些已經(jīng)release掉得對(duì)象,變成“僵尸”许赃,當(dāng)我們?cè)L問(wèn)一個(gè)Zombie對(duì)象時(shí)止喷,Xcode可以告訴我們正在訪問(wèn)的對(duì)象是一個(gè)不應(yīng)該存在的對(duì)象了。因?yàn)閄code知道這個(gè)對(duì)象是什么混聊,所以可以讓我們知道這個(gè)對(duì)象在哪里弹谁,以及這是什么時(shí)候發(fā)生的。所以Zombies是你的好基友!他可以讓你輸出的信息更具體Tし摺沟于!具體這樣做:圖15
自己再試試輸出Object的信息咯,是不是很棒呢植康?僵尸只能用在模擬器和OC語(yǔ)言哦~

進(jìn)擊的碼農(nóng)
如果說(shuō)你已經(jīng)把打印的藝術(shù)運(yùn)用的風(fēng)生水起了旷太,并且斷點(diǎn)的使用可以信手拈來(lái)隨心所欲,那么你已經(jīng)在與逼優(yōu)雞的對(duì)峙中销睁,穩(wěn)操大部分勝券了供璧,你已經(jīng)是一個(gè)孤高冷艷的程序員了,俯視一切低能的逼優(yōu)雞了冻记!但是睡毒!面對(duì)更強(qiáng)大的敵人——你那禿頂1000°近視牙齒夾著韭菜的有著十年對(duì)戰(zhàn)逼優(yōu)雞的同事面前、以及笑里藏刀眼睛有眼屎但是能用眼神殺死你的面試官…… 對(duì)于他們檩赢,你還是太弱吕嘀,你的技能的磨練還太少!所以你必須要進(jìn)擊U曷鳌偶房!比逼優(yōu)雞還要強(qiáng)大的敵人出現(xiàn)了!我們需要更強(qiáng)大的武器军浆。
Console(lldb 命令)
我們的目標(biāo)是要武裝到鼻毛棕洋!console窗口大家知道就是哪個(gè)黑乎乎好多字會(huì)滾出來(lái),尤其是被逼優(yōu)雞干到的時(shí)候乒融,那么同學(xué)們有沒(méi)有遇到這種console呢圖16

我們家的編譯器歷史 敬請(qǐng)亂入 《iOS中的預(yù)編譯指令的初步探究》 掰盘,沒(méi)錯(cuò)我們現(xiàn)在正在使用著世界上最好的c、c++赞季、oc愧捕、swift的編譯器——LLVM,lldb就是這個(gè)世界上最好的LLVM的調(diào)試器!不要害羞申钩,因?yàn)槲覀兪亲顑?yōu)秀的次绘!所以肯定要用最好的!千萬(wàn)別客氣喲撒遣,隨便用邮偎,就像自己家一樣啊,啊 哈哈 吃吃吃 別只顧著吃飯义黎,多夾菜……哎博主好客的職業(yè)病又犯了禾进,什么?你不知道在哪里用lldb廉涕?首先泻云!你得先crash或者把程序斷下來(lái)艇拍!直到你看到圖16的(lldb)字樣出現(xiàn),你就可以敲命令了~~每次你想查看變量宠纯,常量淑倾,你要重新寫(xiě)NSLog去打印,然后重新編譯征椒,去執(zhí)行,重頭開(kāi)始湃累?太累了勃救,有了lldb你只要這樣圖18

是不是方便到爆炸?當(dāng)你有一個(gè)switch語(yǔ)句治力,你為了測(cè)試每一個(gè)case蒙秒,你都要制造假條件去測(cè)試;有一個(gè)if…else…語(yǔ)句宵统,你為了測(cè)試不同的情況晕讲,你要硬編碼寫(xiě)了不同的情況,編譯好幾次為了測(cè)試每種情況……马澈,我想你應(yīng)該知道為什么自己的頭發(fā)那么稀疏了瓢省。以上的這些情況,只需一次編譯痊班,使用lldb的thread命令勤婚,偽造返回值,欺騙寄存器涤伐,就可以隨心所欲的做完所有測(cè)試了馒胆。是不是牛逼到爆炸?lldb真的很強(qiáng)大凝果,博主沒(méi)有騙你祝迂,這篇博文到此的所有調(diào)試技巧lldb都可以實(shí)現(xiàn),各種斷點(diǎn)器净,各種打印型雳,調(diào)用python插件,運(yùn)行中斷掌动,操作硬件底層四啰,控制程序運(yùn)行線程……lldb都可以做到!仿佛lldb就是另一個(gè)強(qiáng)大的世界4只帧8躺埂!是不是強(qiáng)大到爆炸眷射?其實(shí)如果你不想貪多嚼不爛的話匙赞,你只要精通這個(gè)調(diào)試工具佛掖,基本前面的調(diào)試技能你可以不用學(xué)了,在這里博主也是不才涌庭,lldb的強(qiáng)大不是博主隨便說(shuō)幾句就可以表達(dá)的出來(lái)的芥被, 更多地需要大家事必躬親,才能真正體會(huì)到那種美好坐榆,那種暢快無(wú)比的調(diào)試體驗(yàn)拴魄!這里博主無(wú)私地掏出任意門(mén),這里有很好的文章席镀!可以讓你好好的回味匹中,呵呵《The LLDB Debugger》《About LLDB and Xcode》《LLDB調(diào)試命令初探》《與調(diào)試器共舞 - LLDB 的華爾茲》

Profile(instruments)

圖19

這個(gè)東西怎么翻譯呢?我們就叫檢查器吧:阑濉顶捷!也許已經(jīng)學(xué)習(xí)了iOS開(kāi)發(fā)大半年的你,從來(lái)都沒(méi)注意到或者使用這個(gè)工具屎篱,但是博主很負(fù)責(zé)任的告訴你現(xiàn)在市面上任何一款出色的APP都會(huì)使用instruments來(lái)讓代碼更加健壯服赎!難道instrument是春藥?怎么會(huì)使代碼健壯呢交播?這個(gè)健壯不是那個(gè)健壯~ 我才18歲能不能清純一點(diǎn)呀
instrument里面包含了很多工具重虑,內(nèi)存溢出分析,性能分析堪侯,各種分析…… 如果細(xì)說(shuō)的話嚎尤,這個(gè)真的可以為每個(gè)工具開(kāi)一篇博客,但是博主是一個(gè)懂得授人以魚(yú)不如授人以漁的道理的老司機(jī)伍宦!所以博主當(dāng)然不會(huì)全部說(shuō)一遍芽死!我們就來(lái)領(lǐng)著大家看看專(zhuān)用debug的內(nèi)存溢出分析工具的使用吧!圖20
在使用leaks之前大家可以試試這個(gè)“Analyze”圖21
analyze可以快速的發(fā)現(xiàn)你的代碼中release的問(wèn)題次洼,以及繼承過(guò)程中的父類(lèi)方法缺失等等問(wèn)題关贵!一般一個(gè)優(yōu)秀的iOS開(kāi)發(fā)工程師No Warning、Pass Analyze是最基本的操守卖毁!我知道你已經(jīng)對(duì)于你自己的項(xiàng)目的上百個(gè)warning已經(jīng)麻木了揖曾,但博主我負(fù)責(zé)人地告訴你,這樣不好亥啦!炭剪,因?yàn)橛幸皇自颇厦窀琛独纤緳C(jī)帶帶我》聽(tīng)得博主神清氣爽!
堅(jiān)守作為iOS開(kāi)發(fā)者的貞操翔脱!跟著我高喊口號(hào)奴拦!
No Warning!Pass Analyze届吁!

我們繼續(xù)回來(lái)使用leaks错妖!如果analyze都通過(guò)了绿鸣,那么就可以使用leaks工具,發(fā)現(xiàn)千年老妖級(jí)別的側(cè)漏了暂氯!圖22

如果提示某一個(gè)對(duì)象有側(cè)漏的風(fēng)險(xiǎn)潮模,你還可以這樣彈出側(cè)邊的拓展細(xì)節(jié)圖23
直接點(diǎn)擊方法就可以直接進(jìn)入代碼部分了!痴施!是不是很簡(jiǎn)單粗暴呢擎厢!當(dāng)然還很多其他工具,不過(guò)叫做篇幅的東西總是限制人辣吃,誒 真蛋疼~真的還想多說(shuō)點(diǎn)的 想要更多了解instrument 大家可以看看這篇文章锉矢!《How to Use Instruments in Xcode》

Xcode視圖調(diào)試
有時(shí)候有些逼優(yōu)雞隱藏的比較深,代碼幾乎都翻了個(gè)遍齿尽,還是沒(méi)找到問(wèn)題出在哪,博主可以理解那種風(fēng)中凌亂灯节,蛋碎一地的趕腳循头,因?yàn)闊o(wú)數(shù)個(gè)日夜博主就是深陷當(dāng)中無(wú)法自拔,后來(lái)干脆直接重新新建一個(gè)工程炎疆!還是不行?睢!我去形入,直到有一天博主早上起來(lái)全跨,看到鏡子中自己帥氣的臉龐,我才突然頓悟亿遂,原來(lái)長(zhǎng)得帥可以那樣快速的找到bug浓若!最終鎖定是可愛(ài)又可恨的xib和storyboard出了問(wèn)題!蛇数!某個(gè)constraint或者view的嵌套邏輯又或者團(tuán)隊(duì)協(xié)作Git沖突等等問(wèn)題挪钓,導(dǎo)致io -v什么的錯(cuò)誤,這種情況去檢查視圖文件耳舅,可能xcode崩潰打不開(kāi)那個(gè)xib或者storyboard碌上,你直接使用文本工具打開(kāi)這個(gè)xml類(lèi)型的標(biāo)記文件,你差點(diǎn)吐血浦徊,幾萬(wàn)行的記錄狗眼都看瞎了……馏予。
但是這個(gè)歷史要被終結(jié)!盔性!因?yàn)槲覀儚?qiáng)大的xcode的視圖調(diào)試功能O忌ァ!
以下內(nèi)容纯出,完全copy蚯妇,如有不適敷燎,堅(jiān)持看完!請(qǐng)叫我快樂(lè)的搬運(yùn)工箩言!抄襲自《View Debugging in Xcode 6》蘋(píng)果在Xcode 6中做了不少明顯的改善和優(yōu)化硬贯,視圖調(diào)試就是其中之一。通常陨收,App用戶(hù)界面的行為不會(huì)符合開(kāi)發(fā)者期望的那樣饭豹,比如或者不展示視圖,或者沒(méi)有正確地展示务漩。本文講解如何使用Xcode的新的視圖調(diào)試功能來(lái)簡(jiǎn)化開(kāi)發(fā)者對(duì)問(wèn)題界面的確認(rèn)和修復(fù)拄衰。
1.Demo 工程
開(kāi)始之初先從github(https://github.com/tutsplus/ViewDebugging)上下載示例工程并打開(kāi)ViewDebugging.xcodeproj。該工程包含一個(gè)簡(jiǎn)單的包含少數(shù)視圖控制器的可點(diǎn)擊的應(yīng)用程序饵骨、應(yīng)用程序委托以及一個(gè)storyboard翘悉。該app是為iPhone而設(shè)計(jì),但受益于iOS 8的自適應(yīng)布局,所以界面展示在任何設(shè)備上都沒(méi)有問(wèn)題居触。
您剛剛下載的應(yīng)用程序示例工程是一個(gè)簡(jiǎn)單的to-do list應(yīng)用程序妖混,包含可查看其他信息的簡(jiǎn)單屏幕,比如該示例工程中的項(xiàng)目數(shù)轮洋,用戶(hù)頭像以及@***的推特操作制市。點(diǎn)擊Xcode左上角的運(yùn)行按鈕將展示在iOS模擬器中運(yùn)行的應(yīng)用程序。圖24

很快會(huì)注意到用戶(hù)界面中存在問(wèn)題-表視圖中沒(méi)有展示任何數(shù)據(jù)弊予。在工程導(dǎo)航面板中打開(kāi)FirstViewController.swift并找到以下代碼:
var mockNotesDataSource: [String] = ["Do some laundry", "Finish homework", "Walk the dog", "Learn about view debugging"]{didSet{self.tableView.reloadData()}}

可以看到mockNotesDataSource變量是表視圖的數(shù)據(jù)源祥楣。使用Swift的屬性觀察者功能,在數(shù)據(jù)源發(fā)生改變時(shí)汉柒,表視圖會(huì)自動(dòng)重新加載误褪。通過(guò)查看以上代碼片段,你會(huì)發(fā)現(xiàn)應(yīng)該應(yīng)用中應(yīng)該有4個(gè)項(xiàng)目需要展示碾褂,但現(xiàn)在不展示數(shù)據(jù)就說(shuō)明某些地方出現(xiàn)了差錯(cuò)振坚。
啟用視圖調(diào)試
問(wèn)題似乎與用戶(hù)界面有關(guān)。運(yùn)行app過(guò)程中斋扰,按下底部的Debug View Hierarchy 按鈕渡八,或者從菜單中選擇Debug > View Debugging > Capture View Hierarchy 來(lái)啟動(dòng)視圖調(diào)試。
圖25


啟動(dòng)視圖調(diào)試后传货,Xcode會(huì)對(duì)應(yīng)用程序的視圖層次拍一個(gè)快照并展示三維原型視圖來(lái)探究用戶(hù)界面的層級(jí)屎鳍。該三維視圖除了展示app的視圖層次外,還展示每個(gè)視圖的位置问裕、順序和視圖尺寸逮壁,以及視圖間的交互方式。
示例工程在Xcode中的三維視圖展示正常粮宛,但表視圖單元格似乎有點(diǎn)太寬了窥淆。圖26


暫停應(yīng)用程序調(diào)試并在左側(cè)選中Main.Storyboard來(lái)修復(fù)問(wèn)題卖宠。點(diǎn)擊表視圖并選中Editor > Resolve Auto Layout Issues > Reset to Suggested Constraints.圖27
編譯并再次運(yùn)行應(yīng)用程序以確定用戶(hù)界面展示正常。點(diǎn)擊Debug View Hierarchy按鈕更進(jìn)一步了解視圖調(diào)試的功能忧饭。
視圖調(diào)試功能
點(diǎn)擊并拖拽三維渲染圖的任意一邊扛伍,可旋轉(zhuǎn)或者傾斜用戶(hù)界面,向左或者向右傾斜可選中某個(gè)表視圖词裤。

選中后刺洒,Xcode會(huì)高亮該視圖,并在會(huì)在右邊展示Object 和Size檢查器吼砂。查看在跳轉(zhuǎn)欄頂部并確認(rèn)UITableView是右邊最后一個(gè)項(xiàng)目逆航。圖28



Object 和 Size檢查器包括大量有用的信息。過(guò)去開(kāi)發(fā)者需要依賴(lài)日志語(yǔ)句或者斷點(diǎn)來(lái)檢查視圖的配置渔肩。
打開(kāi)右邊的Size inspector(規(guī)格檢查器)因俐,下方是Auto Layout,可以看到視圖上已經(jīng)應(yīng)用了正確的約束周偎。在Object inspector中女揭,我們可以檢查所選視圖的屬性。圖29

在Xcode的調(diào)試區(qū)有9個(gè)視圖調(diào)試過(guò)程中要用到的按鈕和滑塊兒栏饮。圖30
從左到右控件排序:
調(diào)整視圖間距:調(diào)整不同視圖間的間距。
展示被剪切的內(nèi)容:當(dāng)前展示視圖中被剪切的部分磷仰。
展示約束:展示選中視圖的約束袍嬉。
重置查看區(qū)域:將3D渲染透視圖恢復(fù)至默認(rèn)狀態(tài)。
調(diào)整查看模式:選擇性地展示3D渲染透視圖灶平,比如僅展示內(nèi)容伺通,僅展示框架以及同時(shí)展示內(nèi)容和框架。
縮蟹晗怼:縮小3D渲染透視圖
恢復(fù):將3D渲染透視圖恢復(fù)至默認(rèn)尺寸罐监。

放大:放大3D渲染透視圖
調(diào)整可視視圖范圍:隱藏視圖或展示視圖,一步步解析3D渲染視圖瞒爬,向左或者向右滑動(dòng)滑塊兒有相反的效果弓柱。
建議花一點(diǎn)時(shí)間上手操作下這些空間,并理解各自的用處侧但。
視圖層排序
再次編譯和運(yùn)行應(yīng)用程序矢空,并點(diǎn)擊用戶(hù)界面底部的"More"標(biāo)簽。第一眼看去界面看起來(lái)還OK禀横,但是它沒(méi)有按照開(kāi)發(fā)者的定義準(zhǔn)確執(zhí)行屁药,圖片上的模糊效果沒(méi)有展示出來(lái)。我們可以通過(guò)調(diào)試視圖層次來(lái)更好地確定問(wèn)題所在柏锄。
向左或者向右拖拽視圖來(lái)查看具體情況酿箭,接著將view spacing slider向右拖動(dòng)复亏。圖31


這樣一來(lái),不同視圖間的間距變大了缭嫡,層次也更加清晰缔御,我們看到在圖片"下方"還隱藏著另一個(gè)視圖,選中隱藏的視圖械巡,它就是"丟失"的視覺(jué)效果視圖刹淌。圖32
打開(kāi)Main.storyboard 并選中Second View Controller Scene。在左側(cè)的文檔概覽面板中讥耗,展開(kāi)Second View Controller的視圖對(duì)象以查看子視圖的排序有勾。
Xcode在文檔概覽中按照遞升順序堆疊視圖,換句話說(shuō)古程,列表頂層的視圖是視圖層次的基礎(chǔ)蔼卡。
修復(fù)問(wèn)題很簡(jiǎn)單。運(yùn)行時(shí)挣磨,Blur Effect View隱藏在Sky Image之下雇逞,因?yàn)樗且晥D層次的第一個(gè)視圖。在文檔概覽中點(diǎn)擊并拖拽 Blur Effect View茁裙,結(jié)果會(huì)如下圖展示一樣:圖33
再次運(yùn)行應(yīng)用程序就能看到模糊效果了塘砸。應(yīng)用程序的用戶(hù)界面看起來(lái)符合設(shè)計(jì)的初衷。我們還可以查看iOS模擬器的其他調(diào)試功能晤锥,看看還完善了其他什么地方或功能掉蔬。
5.iOS模擬器調(diào)試功能
編譯并運(yùn)行應(yīng)用程序,選中模擬器矾瘾,從 Debug菜單中選擇Color Blended Layers選項(xiàng)女轿。圖34
然后會(huì)看到app的用戶(hù)界面被紅色和綠色覆蓋,顯示了哪些圖層可以被疊加覆蓋壕翩,以及哪些圖層是透明的蛉迹。混合層屬于計(jì)算密集型視圖放妈,所以推薦盡可能地使用不透明的圖層北救。圖35
蘋(píng)果在其文檔(iOS Simulator User Guide)中對(duì)此進(jìn)行了注明,并在表視圖處理上使用了不透明圖層芜抒。滾動(dòng)視圖時(shí)會(huì)有些表現(xiàn)不大好的地方扭倾,一個(gè)重要的原因就是使用了混合圖層,而如果內(nèi)容背景是不透明層挽绩,那么頁(yè)面滾動(dòng)效果就會(huì)非常流暢和平穩(wěn)膛壹。
對(duì)于這款應(yīng)用程序來(lái)說(shuō),假使用戶(hù)有數(shù)百個(gè)項(xiàng)目要展示,可能會(huì)出現(xiàn)滾動(dòng)性能不一致的情況模聋。表視圖單元格當(dāng)前使用的是混合層肩民。由于視圖控制器的視圖背景是白色,所以不管表視圖單元格使用的是混合層或者不透明層链方,終端用戶(hù)不會(huì)覺(jué)察到有什么不一樣持痰。
打開(kāi)Main.storyboard并選中To Do list Scene中的表視圖單元格屬性。在屬性檢查器(Attributes Inspector)中祟蚀,向下滾動(dòng)Drawing分區(qū)并勾選Opaque工窍。圖36
在啟用Color Blended Layers的狀態(tài)下編譯并運(yùn)行應(yīng)用程序。由于表視圖單元格現(xiàn)在使用了不透明層前酿,所以會(huì)用綠色覆蓋患雏,以指示它們是不透明的。
除了標(biāo)記圖層外罢维,還有其他一些有用的功能可幫開(kāi)發(fā)者在iOS模擬器中調(diào)試應(yīng)用淹仑。以下是其中一些比較有用的:
Toggle Slow Animations in Frontmost App: 選中模擬器,打開(kāi)Debug菜單選中Toggle Slow Animations in Frontmost App肺孵,該功能可以降低app中動(dòng)畫(huà)的運(yùn)行速度匀借,適合調(diào)試包含復(fù)雜動(dòng)畫(huà)的應(yīng)用程序。也可是使用快捷鍵Command-T來(lái)操作平窘。Color Copied Images:該選項(xiàng)可以給繪制時(shí)被Core Animation復(fù)制的圖片添加藍(lán)綠色疊加層吓肋。Color Misaligned Images:如果圖片邊界沒(méi)有與目標(biāo)像素完美對(duì)齊,該功能可為圖片疊加上一層品紅色瑰艘。如果圖片使用確定的比例大小繪制是鬼,那么該功能會(huì)為圖片添加一層黃色疊加。Color Off Screen Rendered:.該選項(xiàng)為離屏渲染內(nèi)容添加一個(gè)黃色的疊加層磅叛。很多開(kāi)發(fā)者會(huì)忽略接入電話時(shí)應(yīng)用狀態(tài)欄的設(shè)計(jì)問(wèn)題,你可以通過(guò)觸發(fā)通話中狀態(tài)欄來(lái)簡(jiǎn)單測(cè)試萨赁。在iOS模擬器中弊琴,從Hardware菜單中選中Toggle In-Call Status Bar。
想查看app如何響應(yīng)事件杖爽,可按下Command-T來(lái)啟用slow animations敲董,并按下Command-Y來(lái)展示電話接入時(shí)的狀態(tài)欄。倘若你的應(yīng)用程序使用了導(dǎo)航欄慰安,那么操作系統(tǒng)會(huì)為你兼顧到這一塊兒腋寨。圖37
除了給視圖著色外,還要記住iOS模擬器也可以調(diào)試Core Location問(wèn)題化焕。你可以在特定經(jīng)緯度模擬設(shè)備萄窜,
如果你的應(yīng)用程序使用iCloud來(lái)管理數(shù)據(jù),你也可以手動(dòng)觸發(fā)同步事件。
本文中使用的demo app非常簡(jiǎn)單查刻,使用文中提到的技術(shù)可以幫你在未來(lái)節(jié)省不少時(shí)間键兜。視圖調(diào)試可以幫你修正很多用戶(hù)界面中出現(xiàn)的問(wèn)題。
除了Xcode和InterfaceBuilder之外穗泵,使用iOS模擬器的調(diào)試功能可以提升應(yīng)用性能和識(shí)別開(kāi)發(fā)過(guò)程中的瓶頸普气。蘋(píng)果的人機(jī)交互指南(中文版 英文版)強(qiáng)調(diào)了積極響應(yīng)對(duì)app的重要性,能讓用戶(hù)覺(jué)得應(yīng)用易于使用和操作佃延。蘋(píng)果對(duì)InterfaceBuilder的提升讓視圖調(diào)試變得前所未有的簡(jiǎn)單现诀。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市履肃,隨后出現(xiàn)的幾起案子仔沿,更是在濱河造成了極大的恐慌,老刑警劉巖榆浓,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件于未,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡陡鹃,警方通過(guò)查閱死者的電腦和手機(jī)烘浦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)萍鲸,“玉大人闷叉,你說(shuō)我怎么就攤上這事〖挂酰” “怎么了握侧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嘿期。 經(jīng)常有香客問(wèn)我品擎,道長(zhǎng),這世上最難降的妖魔是什么备徐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任萄传,我火速辦了婚禮,結(jié)果婚禮上蜜猾,老公的妹妹穿的比我還像新娘秀菱。我一直安慰自己,他們只是感情好蹭睡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布衍菱。 她就那樣靜靜地躺著,像睡著了一般肩豁。 火紅的嫁衣襯著肌膚如雪脊串。 梳的紋絲不亂的頭發(fā)上辫呻,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音洪规,去河邊找鬼印屁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛斩例,可吹牛的內(nèi)容都是我干的雄人。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼念赶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼础钠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起叉谜,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤旗吁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后停局,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體很钓,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年董栽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了码倦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锭碳,死狀恐怖袁稽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情擒抛,我是刑警寧澤推汽,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站歧沪,受9級(jí)特大地震影響歹撒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诊胞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一暖夭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧厢钧,春花似錦鳞尔、人聲如沸嬉橙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)市框。三九已至霞扬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喻圃。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工萤彩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斧拍。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓惯殊,卻偏偏與公主長(zhǎng)得像揪荣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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