iOS各種調(diào)試技巧

前言

最近博主臨近畢業(yè)季赛糟,為了完美的寫一篇畢業(yè)論文,真是:“鋤禾日當(dāng)午砸逊,汗滴禾下土”<—— 這句詩跟畢業(yè)我寫畢業(yè)論文沒任何一毛錢關(guān)系璧南,我就是突然想吟濕了。不過博主作為網(wǎng)絡(luò)工程專業(yè)的好青年痹兜,曾經(jīng)的愿望和理想就是在下水道干出一番轟轟烈烈的大事業(yè)穆咐,沒錯是就是下水道澡刹,我們的征途在下水道O笥弧!不過大家別誤會欣范,我不是忍者龜?shù)哪X殘粉遗淳!聽我繼續(xù)說拍柒!我想的是等我在各大排水系統(tǒng)各大下水道功成名就的時(shí)候,我就可以指著一個井蓋對我的孫子說:“諾 那個下面的通信光纜是爺爺我接的G怠拆讯!” 我滿臉自豪地接受著這孫子的敬仰!但是啊养叛,曾經(jīng)的愿望都實(shí)現(xiàn)不了了种呐,我深深愛著的地下通信光纜啊,曾經(jīng)多少個夜晚淚水打濕了我的畢業(yè)論文弃甥,渲染開的筆墨那都是哥逝去的青春啊爽室。

因?yàn)樯罹拖耖_了博主一個玩笑,讓博主遇到了一種雞淆攻,那是一種特殊品種的雞阔墩,它叫做逼優(yōu)雞!瓶珊!就是這只雞讓博主無緣無故的成了一只APM超200的野生究極程序猿Pン铩!吼~ 嗷~伞芹,把博主帶離了下水道忘苛!并且與這只雞踏上另一端征途!臨走的時(shí)候丑瞧,下水道的通信光纜就交給你們了柑土,肥皂基友們(網(wǎng)絡(luò)工程的基友們)!绊汹!我靠稽屏,他們竟然在打印店花了50塊錢就直接買了一套深度豪華畢業(yè)論文套餐!里面包含了論文西乖,工程制圖狐榔,CAD坛增,報(bào)價(jià)清單,拓?fù)浣Y(jié)構(gòu)……最重要的是老板承諾不需任何修改薄腻,直接可以通過畢業(yè)答辯收捣,不通過來年免費(fèi)再提供一套論文,最貼心的是竟然支持通過再付款b挚罢艾!,

圖1

老子寫論文寫了半個月像狗一樣尽纽,他們竟然直接就買了咐蚯!就這么買過去了!弄贿!對得起老師的諄諄教誨春锋、自己的辛苦付出和父母的期待么?我就問你們慚愧不慚愧差凹?為什么買的時(shí)候不喊上我期奔?淚已淌干~

扯蛋過多容易腎虧

逼優(yōu)雞

終于來到了大家期待的正片,今天我就要和大家講我和逼優(yōu)雞的故事危尿,逼優(yōu)雞它優(yōu)雅低調(diào)呐萌,它身材玲瓏,藏匿在黑暗處谊娇,挑動著我的欲望搁胆!曾多個日夜博主都……(擦!尼瑪邮绿,逼優(yōu)雞是什么鬼?說好的技術(shù)文章?)同學(xué)你真的(biè)急攀例,你先坐下船逮,先把鞋子穿好!我說的逼優(yōu)雞它的英文名叫做(Bug)粤铭,它挺(T)美(M)的(D)……

歌仔唱的好:

多少猿曾被它奪走年輕的容顏

多少猿曾在它面前亮門禿了頭

多少Bug曾經(jīng)生命中來了又還

可知一生有你我都陪在你身邊

圖2

無數(shù)個夜晚你揪著頭發(fā)和Bug撕咬的情景博主可以體會挖胃,所以這次的這篇文章博主就要給大家整理一個調(diào)教iOS逼優(yōu)雞的方法豪華套餐!梆惯!放心酱鸭!絕對的深度豪華,因?yàn)橐呀?jīng)加入肯德基豪華午餐咳咳其實(shí)是因?yàn)楸苾?yōu)雞(Bug)對于我們畢竟是除了老婆之外第二可怕的存在垛吗!我們必須要練就銅頭鐵臂十八般武藝凹髓,祭練奇門巧技各種大殺!方可與之周旋并將之殲滅怯屉!好蔚舀!跟著博主一起裝逼一起飛吧6住!6奶伞狼牺!

第一步:

我看大家蓬頭垢面的就知道大家剛剛也才debug回來 ,我們就先寫個hello world壓壓驚把礼患!

第二步

……

知己知彼 百戰(zhàn)不殆

此處為大量Copy是钥!不喜請噴!

The software doesn't do something that the product specification says it should do.

The software does something that the product specification says it shouldn't do.

The software does something that the product specification doesn't mention.

The software doesn't do something that the product specification doesn't mention but should.

The software is difficult to understand, hard to use, slow, or in the software tester's eyes will be viewed by the end user as just plain not right.

我不是英文教師缅叠,請大家自行切換多語言閱讀模式悄泥。

也還有有人粗暴的定義 ”Bug就是錯誤“,除了世界上第一只Bug是飛進(jìn)去的那只蟲子外痪署,其他Bug毋庸置疑那都是程序員們自己生下來的码泞!程序員們自己犯的錯誤!如果說一個軟件作品(請尊重你自己的作品狼犯,不要喊他們”產(chǎn)品”或者”項(xiàng)目”)是程序員們自己的孩子余寥,那么Bug就是這個孩子的生的病,有病得治悯森,藥不能停宋舷!生病有各種治療方法,物療瓢姻,理療祝蝠,化療,心理療……那么“治療”Bug也是有多中方法的幻碱!下面博主會一一列舉绎狭!懲治這些個Bug之前,博主要先阿拉巴拉一番褥傍,遇到Bug也是一件比較嗶了狗了的事情儡嘶,你要知道任何人都會生病,沒有例外恍风!所有任何代碼都有Bug這是定理蹦狂,我們首先要從心態(tài)上端正Bug這件事情,我們可以理解為缺憾也是一種美朋贬,就像阿雨說的“沒有皺紋的祖母是可怕的凯楔,沒有白發(fā)的老者是讓人遺憾的。沒有廢墟的人生太累了锦募,沒有廢墟的大地太擠了摆屯,掩蓋廢墟的舉動太偽詐了∮玻”Debug是為了證明程序有錯鸥拧,而不是證明程序無錯誤党远;所以我們要做到臨Bug而不懼者,圣人之勇也!所以我們要做到戰(zhàn)略上藐視它富弦,戰(zhàn)術(shù)上重視它沟娱!你要心理默念Bug其實(shí)挺(T)美(M)的(D)!anyway 無Bug不生活!腕柜!

抽刀斷Bug

斷點(diǎn)济似,(我求你們不要想到張敬軒,阿軒他容易么盏缤,小受又怎么了砰蠢?你們這幫人真是的!0ν)台舱,我要說的斷點(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)丑說說自己的理解吧讼撒,斷點(diǎn)浑厚,顧名思義就是從前有一個點(diǎn),后來它斷了根盒,謝謝钳幅,我的故事講完了。哎喲還不服炎滞,這些基礎(chǔ)常識的東西自己不會查贡这?你還真的臉皮厚上天了去了,還要博主給你查喲厂榛,自己查去!

普通操作

如圖3

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

圖4

點(diǎn)擊那個黑列列就創(chuàng)建了一個斷點(diǎn)丽惭,再次點(diǎn)擊就臨時(shí)取消這個斷點(diǎn)(但是不刪除)击奶,長按那個斷點(diǎn)拖出去就刪除了(mac os的系統(tǒng)工程師就是稀飯拖動的快感),當(dāng)然也可以右鍵那個創(chuàng)建的斷點(diǎn)责掏,會彈出相應(yīng)地菜單柜砾。

當(dāng)然也還可以監(jiān)視某個變量!

圖5

在對象視圖中换衬,右鍵某個對象痰驱,點(diǎn)擊“Watch ‘XXX’”就完成XXX對象的監(jiān)視了证芭。

這里我監(jiān)視了lab這個UILabel的變量,每當(dāng)這個變量進(jìn)行更新它的信息就會被打印到控制臺担映。

好吧废士!我們最基本的創(chuàng)建斷點(diǎn)的工作已經(jīng)學(xué)會了,Xcode舒服在什么地方呢蝇完?就是不分Debug模式和Run模式的官硝,可以說是無縫切換的,你只要沒有創(chuàng)建斷點(diǎn)短蜕,那么就是Run的正常模式氢架,如果創(chuàng)建了斷點(diǎn)并且運(yùn)行到斷點(diǎn)處,就自動進(jìn)入Debug模式咯朋魔,不像某EC開頭的IDE岖研,控制面板就像開飛機(jī)的一樣,幾萬個按鈕以為很強(qiáng)大警检,其實(shí)只用了Run和Stop孙援,還有什么Debug模式,App模式……解滓,果然Xcode的優(yōu)越感在對比中更加強(qiáng)烈了赃磨,舒服到極點(diǎn)呀,就像夏天的海風(fēng)拂過菊花洼裤,嗯是的 就是那種感覺邻辉!

我們創(chuàng)建好了斷點(diǎn),運(yùn)行到斷點(diǎn)就自動停下來了腮鞍,像這樣:

圖6

這些Debug的最基本操作技能是每一個入門的iOS開發(fā)者都要掌握的值骇,應(yīng)該當(dāng)成一種本能,就像狗愛吃翔一樣(噢 對不起 博主不是歧視狗的意思移国,博主也養(yǎng)過狗吱瘩,很二逼但是從不吃翔!真的據(jù)我所知它從來不吃翔的迹缀,這里只是比喻只是比喻)使碾。

全局?jǐn)帱c(diǎn)(Global BreakPoint)

有時(shí)候在程序出錯的時(shí)候不能能準(zhǔn)確定位到奔潰的那一行代碼,而是直接跑到main循環(huán)或者Appdelegate里面, 或者會給你這樣的提示:

EXEC_BAD_ACCESS:

是不是有種想哭的沖動祝懂?尼瑪至少給我一些堆棧信息也好呀……這個時(shí)候你千萬不要砸鼠標(biāo)和鍵盤哦票摇,一切都是主機(jī)在運(yùn)行,你砸鼠標(biāo)和鍵盤有什么用呢砚蓬?應(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)隔躲,這樣只要遇到錯誤,debug程序就會自動定位到棧底的信息物延,也就是你最先出錯的代碼的那一行宣旱,這樣你就可以快樂的debug拉~~

條件斷點(diǎn)(Condational Breakpoints)

從前有一個游戲,叫做擼啊擼教届,有些玩家他們知道怎么操作响鹃,會放技能會走路,但是他們不知道買裝備案训,玩了一局下來买置,鞋子小刀都沒有買。我為什么講這個故事呢强霎?因?yàn)楹芏嘈∨笥褜W(xué)東西和玩游戲一樣忿项,看完前面的幾種調(diào)試技能,就以為自己已經(jīng)屌爆無敵了城舞,其實(shí)他們不過是出門不帶裝備的玩家轩触,如果只是使用了以上的調(diào)試技能只能說是低玩,在高大的逼優(yōu)雞面前根本就是會被瞬秒的那種家夺,所以學(xué)會裝備自己才是王道脱柱!條件斷點(diǎn),就是學(xué)會有的放矢拉馋!

我們來看一段代碼

圖8

你是不是想問博主為何那么風(fēng)騷榨为,竟然上了Swift了!煌茴!我此刻只想吟一首濕:別人笑我太淫蕩随闺,我家住在黃鶴樓。

反正這個年代大家都是吃飽了撐著的蔓腐,博主也是矩乐,所以就學(xué)學(xué)Swift咯。

我們?nèi)绻谝粋€循環(huán)里面使用了斷點(diǎn)回论,如果這個循環(huán)執(zhí)行了100萬次散罕,那你的斷點(diǎn)要執(zhí)行那么多次,你不覺得蛋蛋都涼了的憂傷么傀蓉?所以我們這么做:

圖9

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

圖10

是不是很棒呢!

有些童鞋的鈦合金狗眼已經(jīng)看到了編輯斷點(diǎn)那里有一個Action的東西僚害,那是什么呢?

這個是非常強(qiáng)大的,可以在你斷點(diǎn)的位置萨蚕,執(zhí)行各種操作靶草,比如執(zhí)行腳本命令,控制臺命令(可以制定調(diào)試信息自定義保存)岳遥、打印信息等奕翔,

博主最喜歡的就是這個Log message啦,簡單粗暴浩蓉!根本就不需要print啊NSLog嘛派继,直接在斷點(diǎn)的Action打印就好了(其實(shí)這個是Xcode和調(diào)試器結(jié)合的高能產(chǎn)物,下面再介紹)捻艳。具體可以這樣:

圖11

其實(shí)剛剛博主撒謊了驾窟,博主最喜歡的Action并不是Log Message,而是Sound认轨,顧名思義嘛绅络,斷點(diǎn)射在Bug上,這樣遇到斷點(diǎn)就會發(fā)出聲音嘁字,聽到我自己設(shè)置的聲音恩急,我就知道是什么Bug了,聽聲識Bug纪蜒,呵呵衷恭,EXEC_BAD_ACCESS的錯誤我設(shè)置成了波多野老師的聲音,unrecognized selector send to instancd的錯誤我設(shè)置成了蒼老師的…… 不要問我系統(tǒng)怎么沒有吉澤明步的聲音纯续,我根本就不知道誰是吉澤明步随珠。

當(dāng)然還有更加強(qiáng)大的條件斷點(diǎn)就是這貨啦

圖12

添加之后在 Symbol 一欄輸入viewDidLoad

這樣一來杆烁,在程序中所有的 viewDidLoad 方法被調(diào)用時(shí)都會觸發(fā)斷點(diǎn)牙丽。

圖13

當(dāng)然,我們也可以僅僅為特定的某個類的方法添加斷點(diǎn)兔魂。在 Symbol 一欄輸入 [ClassName viewDidLoad] (Objective-C)ClassName.viewDidLoad (Swift) 即可烤芦。

比如:unrecognized selector sent to instance 0xaxxxx 這種錯誤,這個instance可以這樣快速定位

圖14

打印的藝術(shù)

盡管ARC已經(jīng)讓內(nèi)存管理變得簡單析校、省時(shí)和高效构罗,但是在object的life-cycles中跟蹤一些重要事件依然十分重要。畢竟ARC并沒有完全排除內(nèi)存泄露的可能性智玻,或者試圖訪問一個被release的對象遂唧。為了這個目的,我們可以很藝術(shù)地偷窺對象正在做些什么吊奢,想想就好有快感盖彭。

NSLog

小伙伴們第一節(jié)課學(xué)習(xí)ViewController的生命周期的時(shí)候,老師肯定很猥瑣的教了大家,在viewController的每個生命周期的方法中使用了NSLog來偷窺召边!沒錯铺呵,這樣其實(shí)就是最簡單爆炸的跟蹤生命周期的方法了,不過系統(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ù)編譯指令的初步探究》{:target="_blank"}

這樣打印出來的東西才像話嘛(其實(shí)NSLog的打印是非常低效的宾茂,甚至比print低100倍畅卓,感興趣自己翻翻蘋果手冊咯)。

使用objc語言(強(qiáng)類型)并且用NSLog打印的時(shí)候,常常搞不清楚NSLog(@“%?”,xxx) xxx這種類型該是什么什么類型輸出,應(yīng)該是%d呢還是%@亦或是%f?肝谭??傻傻分不清楚~蛾扇,所以玩轉(zhuǎn)NSLog你應(yīng)該要知道以下這幾個全局方法攘烛!

圖17

開啟僵尸對象(Enable NSZombie Objects)

Xcode可以把那些已經(jīng)release掉得對象,變成“僵尸”镀首,當(dāng)我們訪問一個Zombie對象時(shí)坟漱,Xcode可以告訴我們正在訪問的對象是一個不應(yīng)該存在的對象了。因?yàn)閄code知道這個對象是什么更哄,所以可以讓我們知道這個對象在哪里芋齿,以及這是什么時(shí)候發(fā)生的。

所以Zombies是你的好基友成翩!他可以讓你輸出的信息更具體C倮Α!

具體這樣做:

圖15

自己再試試輸出Object的信息咯麻敌,是不是很棒呢栅炒?

僵尸只能用在模擬器和OC語言哦~

進(jìn)擊的碼農(nóng)

如果說你已經(jīng)把打印的藝術(shù)運(yùn)用的風(fēng)生水起了,并且斷點(diǎn)的使用可以信手拈來隨心所欲术羔,那么你已經(jīng)在與逼優(yōu)雞的對峙中赢赊,穩(wěn)操大部分勝券了,你已經(jīng)是一個孤高冷艷的程序員了级历,俯視一切低能的逼優(yōu)雞了释移!但是!面對更強(qiáng)大的敵人——你那禿頂1000°近視牙齒夾著韭菜的有著十年對戰(zhàn)逼優(yōu)雞的同事面前寥殖、以及笑里藏刀眼睛有眼屎但是能用眼神殺死你的面試官…… 對于他們玩讳,你還是太弱涩蜘,你的技能的磨練還太少!所以你必須要進(jìn)擊Q俊皱坛!比逼優(yōu)雞還要強(qiáng)大的敵人出現(xiàn)了!我們需要更強(qiáng)大的武器豆巨。

Console(lldb 命令)

我們的目標(biāo)是要武裝到鼻毛!console窗口大家知道就是哪個黑乎乎好多字會滾出來掐场,尤其是被逼優(yōu)雞干到的時(shí)候往扔,那么同學(xué)們有沒有遇到這種console呢

圖16

我們家的編譯器歷史 敬請亂入 《iOS中的預(yù)編譯指令的初步探究》 ,沒錯我們現(xiàn)在正在使用著世界上最好的c熊户、c++萍膛、oc、swift的編譯器——LLVM,lldb就是這個世界上最好的LLVM的調(diào)試器嚷堡!不要害羞蝗罗,因?yàn)槲覀兪亲顑?yōu)秀的!所以肯定要用最好的蝌戒!千萬別客氣喲串塑,隨便用,就像自己家一樣啊北苟,啊 哈哈 吃吃吃 別只顧著吃飯桩匪,多夾菜……哎博主好客的職業(yè)病又犯了,什么友鼻?你不知道在哪里用lldb傻昙?

首先!你得先crash或者把程序斷下來彩扔!直到你看到圖16的(lldb)字樣出現(xiàn)妆档,你就可以敲命令了~~

每次你想查看變量,常量虫碉,你要重新寫NSLog去打印贾惦,然后重新編譯,去執(zhí)行蔗衡,重頭開始纤虽?太累了,有了lldb你只要這樣

圖18

是不是方便到爆炸绞惦?

當(dāng)你有一個switch語句逼纸,你為了測試每一個case,你都要制造假條件去測試济蝉;有一個if…else…語句杰刽,你為了測試不同的情況菠发,你要硬編碼寫了不同的情況,編譯好幾次為了測試每種情況……贺嫂,我想你應(yīng)該知道為什么自己的頭發(fā)那么稀疏了滓鸠。

以上的這些情況,只需一次編譯第喳,使用lldb的thread命令糜俗,偽造返回值,欺騙寄存器曲饱,就可以隨心所欲的做完所有測試了悠抹。

是不是牛逼到爆炸?

lldb真的很強(qiáng)大扩淀,博主沒有騙你楔敌,這篇博文到此的所有調(diào)試技巧lldb都可以實(shí)現(xiàn),各種斷點(diǎn)驻谆,各種打印卵凑,調(diào)用python插件,運(yùn)行中斷胜臊,操作硬件底層勺卢,控制程序運(yùn)行線程……lldb都可以做到!仿佛lldb就是另一個強(qiáng)大的世界G恕V德!

是不是強(qiáng)大到爆炸织盼?

其實(shí)如果你不想貪多嚼不爛的話杨何,你只要精通這個調(diào)試工具,基本前面的調(diào)試技能你可以不用學(xué)了沥邻,在這里博主也是不才危虱,lldb的強(qiáng)大不是博主隨便說幾句就可以表達(dá)的出來的,

更多地需要大家事必躬親唐全,才能真正體會到那種美好埃跷,那種暢快無比的調(diào)試體驗(yàn)!

這里博主無私地掏出任意門邮利,這里有很好的文章弥雹!可以讓你好好的回味,呵呵

《The LLDB Debugger》{:target="_blank"}

《About LLDB and Xcode》{:target="_blank"}

《LLDB調(diào)試命令初探》{:target="_blank"}

《與調(diào)試器共舞 - LLDB 的華爾茲》{:target="_blank"}

Profile(instruments)

圖19

這個東西怎么翻譯呢延届?我們就叫檢查器吧<粑稹!也許已經(jīng)學(xué)習(xí)了iOS開發(fā)大半年的你方庭,從來都沒注意到或者使用這個工具厕吉,但是博主很負(fù)責(zé)任的告訴你現(xiàn)在市面上任何一款出色的APP都會使用instruments來讓代碼更加健壯酱固!難道instrument是春藥?怎么會使代碼健壯呢头朱?

這個健壯不是那個健壯~ 我才18歲能不能清純一點(diǎn)呀

instrument里面包含了很多工具运悲,內(nèi)存溢出分析,性能分析项钮,各種分析…… 如果細(xì)說的話班眯,這個真的可以為每個工具開一篇博客,但是博主是一個懂得授人以魚不如授人以漁的道理的老司機(jī)烁巫!所以博主當(dāng)然不會全部說一遍鳖敷!我們就來領(lǐng)著大家看看專用debug的內(nèi)存溢出分析工具的使用吧!

圖20

在使用leaks之前大家可以試試這個“Analyze”

圖21

analyze可以快速的發(fā)現(xiàn)你的代碼中release的問題程拭,以及繼承過程中的父類方法缺失等等問題!一般一個優(yōu)秀的iOS開發(fā)工程師No Warning棍潘、Pass Analyze是最基本的操守恃鞋!我知道你已經(jīng)對于你自己的項(xiàng)目的上百個warning已經(jīng)麻木了,但博主我負(fù)責(zé)人地告訴你亦歉,這樣不好恤浪!,因?yàn)橛幸皇自颇厦窀琛独纤緳C(jī)帶帶我》聽得博主神清氣爽肴楷!

堅(jiān)守作為iOS開發(fā)者的貞操水由!跟著我高喊口號!

No Warning赛蔫!Pass Analyze砂客!

我們繼續(xù)回來使用leaks!如果analyze都通過了呵恢,那么就可以使用leaks工具鞠值,發(fā)現(xiàn)千年老妖級別的側(cè)漏了!

圖22

如果提示某一個對象有側(cè)漏的風(fēng)險(xiǎn)渗钉,你還可以這樣彈出側(cè)邊的拓展細(xì)節(jié)

圖23

直接點(diǎn)擊方法就可以直接進(jìn)入代碼部分了M瘛!

是不是很簡單粗暴呢鳄橘!當(dāng)然還很多其他工具声离,不過叫做篇幅的東西總是限制人,誒 真蛋疼~真的還想多說點(diǎn)的

想要更多了解instrument 大家可以看看這篇文章瘫怜!

《How to Use Instruments in Xcode》{:target="_blank"}

Xcode視圖調(diào)試

有時(shí)候有些逼優(yōu)雞隱藏的比較深术徊,代碼幾乎都翻了個遍,還是沒找到問題出在哪宝磨,博主可以理解那種風(fēng)中凌亂弧关,蛋碎一地的趕腳盅安,因?yàn)闊o數(shù)個日夜博主就是深陷當(dāng)中無法自拔,后來干脆直接重新新建一個工程世囊!還是不行1鸩t。∥胰ブ旰叮钡接幸惶觳┲髟缟掀饋眚吹界R子中自己帥氣的臉龐,我才突然頓悟嗤瞎,原來長得帥可以那樣快速的找到bug墙歪!最終鎖定是可愛又可恨的xib和storyboard出了問題!贝奇!某個constraint或者view的嵌套邏輯又或者團(tuán)隊(duì)協(xié)作Git沖突等等問題虹菲,導(dǎo)致io -v什么的錯誤,這種情況去檢查視圖文件掉瞳,可能xcode崩潰打不開那個xib或者storyboard毕源,你直接使用文本工具打開這個xml類型的標(biāo)記文件,你差點(diǎn)吐血陕习,幾萬行的記錄狗眼都看瞎了……霎褐。

但是這個歷史要被終結(jié)!该镣!因?yàn)槲覀儚?qiáng)大的xcode的視圖調(diào)試功能6沉А!

以下內(nèi)容损合,完全copy省艳,如有不適,堅(jiān)持看完嫁审!請叫我快樂的搬運(yùn)工拍埠!

抄襲自《View Debugging in Xcode 6》{:target="_blank"}

蘋果在Xcode 6中做了不少明顯的改善和優(yōu)化,視圖調(diào)試就是其中之一土居。通常枣购,App用戶界面的行為不會符合開發(fā)者期望的那樣,比如或者不展示視圖擦耀,或者沒有正確地展示棉圈。本文講解如何使用Xcode的新的視圖調(diào)試功能來簡化開發(fā)者對問題界面的確認(rèn)和修復(fù)。

1.Demo 工程

開始之初先從github(https://github.com/tutsplus/ViewDebugging)上下載示例工程并打開ViewDebugging.xcodeproj眷蜓。該工程包含一個簡單的包含少數(shù)視圖控制器的可點(diǎn)擊的應(yīng)用程序分瘾、應(yīng)用程序委托以及一個storyboard。該app是為iPhone而設(shè)計(jì)吁系,但受益于iOS 8的自適應(yīng)布局,所以界面展示在任何設(shè)備上都沒有問題德召。

您剛剛下載的應(yīng)用程序示例工程是一個簡單的to-do list應(yīng)用程序白魂,包含可查看其他信息的簡單屏幕,比如該示例工程中的項(xiàng)目數(shù)上岗,用戶頭像以及@***的推特操作福荸。點(diǎn)擊Xcode左上角的運(yùn)行按鈕將展示在iOS模擬器中運(yùn)行的應(yīng)用程序。

圖24

很快會注意到用戶界面中存在問題-表視圖中沒有展示任何數(shù)據(jù)肴掷。在工程導(dǎo)航面板中打開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í)呆瞻,表視圖會自動重新加載台夺。通過查看以上代碼片段,你會發(fā)現(xiàn)應(yīng)該應(yīng)用中應(yīng)該有4個項(xiàng)目需要展示痴脾,但現(xiàn)在不展示數(shù)據(jù)就說明某些地方出現(xiàn)了差錯颤介。

啟用視圖調(diào)試

問題似乎與用戶界面有關(guān)。運(yùn)行app過程中赞赖,按下底部的Debug View Hierarchy 按鈕买窟,或者從菜單中選擇Debug > View Debugging > Capture View Hierarchy 來啟動視圖調(diào)試。

圖25

啟動視圖調(diào)試后薯定,Xcode會對應(yīng)用程序的視圖層次拍一個快照并展示三維原型視圖來探究用戶界面的層級。該三維視圖除了展示app的視圖層次外瞳购,還展示每個視圖的位置话侄、順序和視圖尺寸,以及視圖間的交互方式学赛。

示例工程在Xcode中的三維視圖展示正常年堆,但表視圖單元格似乎有點(diǎn)太寬了。

圖26

暫停應(yīng)用程序調(diào)試并在左側(cè)選中Main.Storyboard來修復(fù)問題盏浇。點(diǎn)擊表視圖并選中Editor > Resolve Auto Layout Issues > Reset to Suggested Constraints.

圖27

編譯并再次運(yùn)行應(yīng)用程序以確定用戶界面展示正常变丧。點(diǎn)擊Debug View Hierarchy按鈕更進(jìn)一步了解視圖調(diào)試的功能。

視圖調(diào)試功能

點(diǎn)擊并拖拽三維渲染圖的任意一邊绢掰,可旋轉(zhuǎn)或者傾斜用戶界面痒蓬,向左或者向右傾斜可選中某個表視圖。

選中后滴劲,Xcode會高亮該視圖攻晒,并在會在右邊展示Object 和Size檢查器。查看在跳轉(zhuǎn)欄頂部并確認(rèn)UITableView是右邊最后一個項(xiàng)目班挖。

圖28

Object 和 Size檢查器包括大量有用的信息鲁捏。過去開發(fā)者需要依賴日志語句或者斷點(diǎn)來檢查視圖的配置。

打開右邊的Size inspector(規(guī)格檢查器)萧芙,下方是Auto Layout给梅,可以看到視圖上已經(jīng)應(yīng)用了正確的約束假丧。在Object inspector中,我們可以檢查所選視圖的屬性动羽。

圖29

在Xcode的調(diào)試區(qū)有9個視圖調(diào)試過程中要用到的按鈕和滑塊兒包帚。

圖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渲染視圖姨夹,向左或者向右滑動滑塊兒有相反的效果纤垂。

建議花一點(diǎn)時(shí)間上手操作下這些空間,并理解各自的用處磷账。

視圖層排序

再次編譯和運(yùn)行應(yīng)用程序峭沦,并點(diǎn)擊用戶界面底部的"More"標(biāo)簽。第一眼看去界面看起來還OK逃糟,但是它沒有按照開發(fā)者的定義準(zhǔn)確執(zhí)行吼鱼,圖片上的模糊效果沒有展示出來。我們可以通過調(diào)試視圖層次來更好地確定問題所在绰咽。

向左或者向右拖拽視圖來查看具體情況菇肃,接著將view spacing slider向右拖動。

圖31

這樣一來取募,不同視圖間的間距變大了琐谤,層次也更加清晰,我們看到在圖片"下方"還隱藏著另一個視圖玩敏,選中隱藏的視圖斗忌,它就是"丟失"的視覺效果視圖。

圖32

打開Main.storyboard 并選中Second View Controller Scene旺聚。在左側(cè)的文檔概覽面板中飞蹂,展開Second View Controller的視圖對象以查看子視圖的排序。

Xcode在文檔概覽中按照遞升順序堆疊視圖翻屈,換句話說陈哑,列表頂層的視圖是視圖層次的基礎(chǔ)。

修復(fù)問題很簡單。運(yùn)行時(shí)惊窖,Blur Effect View隱藏在Sky Image之下刽宪,因?yàn)樗且晥D層次的第一個視圖。在文檔概覽中點(diǎn)擊并拖拽 Blur Effect View界酒,結(jié)果會如下圖展示一樣:

圖33

再次運(yùn)行應(yīng)用程序就能看到模糊效果了圣拄。應(yīng)用程序的用戶界面看起來符合設(shè)計(jì)的初衷。我們還可以查看iOS模擬器的其他調(diào)試功能毁欣,看看還完善了其他什么地方或功能庇谆。

5.iOS模擬器調(diào)試功能

編譯并運(yùn)行應(yīng)用程序,選中模擬器凭疮,從 Debug菜單中選擇Color Blended Layers選項(xiàng)饭耳。

圖34

然后會看到app的用戶界面被紅色和綠色覆蓋,顯示了哪些圖層可以被疊加覆蓋执解,以及哪些圖層是透明的寞肖。混合層屬于計(jì)算密集型視圖衰腌,所以推薦盡可能地使用不透明的圖層新蟆。

圖35

蘋果在其文檔(iOS Simulator User Guide)中對此進(jìn)行了注明,并在表視圖處理上使用了不透明圖層右蕊。滾動視圖時(shí)會有些表現(xiàn)不大好的地方琼稻,一個重要的原因就是使用了混合圖層,而如果內(nèi)容背景是不透明層饶囚,那么頁面滾動效果就會非常流暢和平穩(wěn)帕翻。

對于這款應(yīng)用程序來說,假使用戶有數(shù)百個項(xiàng)目要展示坯约,可能會出現(xiàn)滾動性能不一致的情況。表視圖單元格當(dāng)前使用的是混合層莫鸭。由于視圖控制器的視圖背景是白色闹丐,所以不管表視圖單元格使用的是混合層或者不透明層,終端用戶不會覺察到有什么不一樣被因。

打開Main.storyboard并選中To Do list Scene中的表視圖單元格屬性卿拴。在屬性檢查器(Attributes Inspector)中,向下滾動Drawing分區(qū)并勾選Opaque梨与。

圖36

在啟用Color Blended Layers的狀態(tài)下編譯并運(yùn)行應(yīng)用程序堕花。由于表視圖單元格現(xiàn)在使用了不透明層,所以會用綠色覆蓋粥鞋,以指示它們是不透明的缘挽。

除了標(biāo)記圖層外,還有其他一些有用的功能可幫開發(fā)者在iOS模擬器中調(diào)試應(yīng)用。以下是其中一些比較有用的:

Toggle Slow Animations in Frontmost App: 選中模擬器壕曼,打開Debug菜單選中Toggle Slow Animations in Frontmost App苏研,該功能可以降低app中動畫的運(yùn)行速度,適合調(diào)試包含復(fù)雜動畫的應(yīng)用程序腮郊。也可是使用快捷鍵Command-T來操作摹蘑。

Color Copied Images:該選項(xiàng)可以給繪制時(shí)被Core Animation復(fù)制的圖片添加藍(lán)綠色疊加層。

Color Misaligned Images:如果圖片邊界沒有與目標(biāo)像素完美對齊轧飞,該功能可為圖片疊加上一層品紅色衅鹿。如果圖片使用確定的比例大小繪制,那么該功能會為圖片添加一層黃色疊加过咬。

Color Off Screen Rendered:.該選項(xiàng)為離屏渲染內(nèi)容添加一個黃色的疊加層大渤。

很多開發(fā)者會忽略接入電話時(shí)應(yīng)用狀態(tài)欄的設(shè)計(jì)問題,你可以通過觸發(fā)通話中狀態(tài)欄來簡單測試援奢。在iOS模擬器中兼犯,從Hardware菜單中選中Toggle In-Call Status Bar。

想查看app如何響應(yīng)事件集漾,可按下Command-T來啟用slow animations切黔,并按下Command-Y來展示電話接入時(shí)的狀態(tài)欄。倘若你的應(yīng)用程序使用了導(dǎo)航欄具篇,那么操作系統(tǒng)會為你兼顧到這一塊兒纬霞。

圖37

除了給視圖著色外,還要記住iOS模擬器也可以調(diào)試Core Location問題驱显。你可以在特定經(jīng)緯度模擬設(shè)備舶衬,

如果你的應(yīng)用程序使用iCloud來管理數(shù)據(jù),你也可以手動觸發(fā)同步事件置谦。

本文中使用的demo app非常簡單纠脾,使用文中提到的技術(shù)可以幫你在未來節(jié)省不少時(shí)間。視圖調(diào)試可以幫你修正很多用戶界面中出現(xiàn)的問題栓霜。

除了Xcode和InterfaceBuilder之外翠桦,使用iOS模擬器的調(diào)試功能可以提升應(yīng)用性能和識別開發(fā)過程中的瓶頸。蘋果的人機(jī)交互指南(中文版 英文版)強(qiáng)調(diào)了積極響應(yīng)對app的重要性胳蛮,能讓用戶覺得應(yīng)用易于使用和操作销凑。蘋果對InterfaceBuilder的提升讓視圖調(diào)試變得前所未有的簡單。

結(jié)語

這篇文章博主花了3個禮拜仅炊,斷斷續(xù)續(xù)才寫完的斗幼,當(dāng)中錯漏應(yīng)該非常多,但是無論如何鄙人覺得應(yīng)該算是配的上豪華套餐的稱號了抚垄,當(dāng)中iOS開發(fā)的基本蜕窿、常用以及高階的調(diào)試技能都涉及了谋逻,但是仍然有很多其他的奇門巧技沒有介紹到,主要是可惡的“篇幅”限制住了博主廣博的愛渠羞,但是無論如何斤贰,這篇文章大家暫且可以當(dāng)做是一個調(diào)試技術(shù)的目錄,因?yàn)椴┲髟谶@里寫的講的很粗淺次询,你不應(yīng)該只滿足于這篇文章荧恍,你如果想要改變世界的話,你應(yīng)該借著博主的這篇目錄式文章深入地學(xué)習(xí)與研究屯吊!

當(dāng)然還有Crash的日志送巡、測試工程、以及強(qiáng)大牛逼哄哄的第三方調(diào)試庫等這篇博客沒有涉及到盒卸,這是一個遺憾骗爆,但是我相信聰明的你會去Google一番的!

還有我們與逼優(yōu)雞的故事才剛剛開始蔽介。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摘投,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子虹蓄,更是在濱河造成了極大的恐慌犀呼,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薇组,死亡現(xiàn)場離奇詭異外臂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)律胀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門宋光,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炭菌,你說我怎么就攤上這事罪佳。” “怎么了黑低?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵赘艳,是天一觀的道長。 經(jīng)常有香客問我投储,道長第练,這世上最難降的妖魔是什么阔馋? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任玛荞,我火速辦了婚禮,結(jié)果婚禮上呕寝,老公的妹妹穿的比我還像新娘勋眯。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布客蹋。 她就那樣靜靜地躺著塞蹭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讶坯。 梳的紋絲不亂的頭發(fā)上番电,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機(jī)與錄音辆琅,去河邊找鬼漱办。 笑死,一個胖子當(dāng)著我的面吹牛婉烟,可吹牛的內(nèi)容都是我干的娩井。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼似袁,長吁一口氣:“原來是場噩夢啊……” “哼洞辣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起昙衅,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤扬霜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绒尊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畜挥,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年婴谱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蟹但。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡谭羔,死狀恐怖华糖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘟裸,我是刑警寧澤客叉,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站话告,受9級特大地震影響兼搏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沙郭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一佛呻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧病线,春花似錦吓著、人聲如沸鲤嫡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暖眼。三九已至,卻和暖如春纺裁,著一層夾襖步出監(jiān)牢的瞬間诫肠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工欺缘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留区赵,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓浪南,卻偏偏與公主長得像笼才,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子络凿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評論 2 361

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

  • 摘自iOS界段子小王子http://www.cnblogs.com/daiweilai/p/4421340.htm...
    skylor閱讀 702評論 0 2
  • 轉(zhuǎn)自:http://www.cnblogs.com/daiweilai/p/4421340.html#biyouj...
    Keizo閱讀 946評論 0 1
  • 調(diào)試地址 【1.普通斷點(diǎn)】 當(dāng)程序運(yùn)行到斷點(diǎn)處時(shí)會暫停運(yùn)行骡送。比如斷點(diǎn)打在23行,那么程序就會停在23行(注意:程序...
    iYeso閱讀 3,243評論 7 61
  • 一絮记、人與人是不一樣的 長大后摔踱,越來越見識到,人跟人其實(shí)是不一樣的怨愤。雖說我們生來都是平等的派敷,但是由于家庭環(huán)境出生背景...
    陪你走過8年閱讀 263評論 0 0
  • 姓名:魏浩~公司:杭州龍居門業(yè)有限公司 【日精進(jìn)打卡第39天】 【知~學(xué)習(xí)】 《六項(xiàng)精進(jìn)》1遍共1遍 《大學(xué)》1遍...
    A0魏浩富貴龍別墅門閱讀 286評論 0 0