轉(zhuǎn)自:http://www.cnblogs.com/daiweilai/p/4421340.html#biyouji
前言
最近博主臨近畢業(yè)季,為了完美的寫一篇畢業(yè)論文缭嫡,真是:“鋤禾日當(dāng)午喂很,汗滴禾下土”<—— 這句詩跟畢業(yè)我寫畢業(yè)論文沒任何一毛錢關(guān)系惜颇,我就是突然想吟濕了。不過博主作為網(wǎng)絡(luò)工程專業(yè)的好青年少辣,曾經(jīng)的愿望和理想就是在下水道干出一番轟轟烈烈的大事業(yè)凌摄,沒錯是就是下水道,我們的征途在下水道@焖А锨亏!不過大家別誤會,我不是忍者龜?shù)哪X殘粉忙干!聽我繼續(xù)說器予!我想的是等我在各大排水系統(tǒng)各大下水道功成名就的時候,我就可以指著一個井蓋對我的孫子說:“諾 那個下面的通信光纜是爺爺我接的>杵取乾翔!” 我滿臉自豪地接受著這孫子的敬仰!但是啊弓乙,曾經(jīng)的愿望都實現(xiàn)不了了末融,我深深愛著的地下通信光纜啊,曾經(jīng)多少個夜晚淚水打濕了我的畢業(yè)論文暇韧,渲染開的筆墨那都是哥逝去的青春啊勾习。
因為生活就像開了博主一個玩笑,讓博主遇到了一種雞懈玻,那是一種特殊品種的雞巧婶,它叫做逼優(yōu)雞!!就是這只雞讓博主無緣無故的成了一只APM超200的野生究極程序猿R照弧英岭!吼~ 嗷~,把博主帶離了下水道湿右!并且與這只雞踏上另一端征途诅妹!臨走的時候,下水道的通信光纜就交給你們了毅人,肥皂基友們(網(wǎng)絡(luò)工程的基友們)?越啤!我靠丈莺,他們竟然在打印店花了50塊錢就直接買了一套深度豪華畢業(yè)論文套餐划煮!里面包含了論文,工程制圖缔俄,CAD弛秋,報價清單,拓?fù)浣Y(jié)構(gòu)……最重要的是老板承諾不需任何修改俐载,直接可以通過畢業(yè)答辯蟹略,不通過來年免費再提供一套論文,最貼心的是竟然支持通過再付款O固邸科乎!,
圖1
老子寫論文寫了半個月像狗一樣贼急,他們竟然直接就買了茅茂!就這么買過去了!太抓!對得起老師的諄諄教誨空闲、自己的辛苦付出和父母的期待么?我就問你們慚愧不慚愧走敌?為什么買的時候不喊上我碴倾?淚已淌干~
扯蛋過多容易腎虧
逼優(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)雞的方法豪華套餐H√ァ展哭!放心!絕對的深度豪華闻蛀,因為已經(jīng)加入肯德基豪華午餐咳咳其實是因為逼優(yōu)雞(Bug)對于我們畢竟是除了老婆之外第二可怕的存在摄杂!我們必須要練就銅頭鐵臂十八般武藝,祭練奇門巧技各種大殺循榆!方可與之周旋并將之殲滅!好墨坚!跟著博主一起裝逼一起飛吧Q硪!T罄骸盗尸!
第一步:
我看大家蓬頭垢面的就知道大家剛剛也才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是飛進去的那只蟲子外及塘,其他Bug毋庸置疑那都是程序員們自己生下來的莽使!程序員們自己犯的錯誤!如果說一個軟件作品(請尊重你自己的作品笙僚,不要喊他們”產(chǎn)品”或者”項目”)是程序員們自己的孩子芳肌,那么Bug就是這個孩子的生的病,有病得治肋层,藥不能停亿笤!生病有各種治療方法,物療栋猖,理療净薛,化療,心理療……那么“治療”Bug也是有多中方法的掂铐!下面博主會一一列舉罕拂!懲治這些個Bug之前揍异,博主要先阿拉巴拉一番,遇到Bug也是一件比較嗶了狗了的事情爆班,你要知道任何人都會生病衷掷,沒有例外!所有任何代碼都有Bug這是定理柿菩,我們首先要從心態(tài)上端正Bug這件事情戚嗅,我們可以理解為缺憾也是一種美,就像阿雨說的“沒有皺紋的祖母是可怕的枢舶,沒有白發(fā)的老者是讓人遺憾的懦胞。沒有廢墟的人生太累了,沒有廢墟的大地太擠了凉泄,掩蓋廢墟的舉動太偽詐了躏尉。”Debug是為了證明程序有錯后众,而不是證明程序無錯誤胀糜;所以我們要做到臨Bug而不懼者,圣人之勇也!所以我們要做到戰(zhàn)略上藐視它蒂誉,戰(zhàn)術(shù)上重視它教藻!你要心理默念Bug其實挺(T)美(M)的(D)!anyway 無Bug不生活!右锨!
抽刀斷Bug
斷點括堤,(我求你們不要想到張敬軒,阿軒他容易么绍移,小受又怎么了悄窃?你們這幫人真是的!u褰选)广匙,我要說的斷點是BreakPoint!基本上不是殘廢的IDE都具有斷點調(diào)試功能吧恼策!尤其是XCode鸦致,我們家的IDE斷點調(diào)試功能可是強中又是強中手!在這之前大家可以先了解一下哈子是斷點涣楷?它怎么實現(xiàn)的分唾?工作原理怎么樣的?博主就獻丑說說自己的理解吧狮斗,斷點绽乔,顧名思義就是從前有一個點,后來它斷了碳褒,謝謝折砸,我的故事講完了看疗。哎喲還不服,這些基礎(chǔ)常識的東西自己不會查睦授?你還真的臉皮厚上天了去了两芳,還要博主給你查喲,自己查去去枷!
普通操作
如圖3
基本的斷點操作如下
圖4
點擊那個黑列列就創(chuàng)建了一個斷點怖辆,再次點擊就臨時取消這個斷點(但是不刪除),長按那個斷點拖出去就刪除了(mac os的系統(tǒng)工程師就是稀飯拖動的快感)删顶,當(dāng)然也可以右鍵那個創(chuàng)建的斷點竖螃,會彈出相應(yīng)地菜單。
當(dāng)然也還可以監(jiān)視某個變量逗余!
圖5
在對象視圖中特咆,右鍵某個對象,點擊“Watch ‘XXX’”就完成XXX對象的監(jiān)視了录粱。
這里我監(jiān)視了lab這個UILabel的變量坚弱,每當(dāng)這個變量進行更新它的信息就會被打印到控制臺。
好吧关摇!我們最基本的創(chuàng)建斷點的工作已經(jīng)學(xué)會了,Xcode舒服在什么地方呢碾阁?就是不分Debug模式和Run模式的输虱,可以說是無縫切換的,你只要沒有創(chuàng)建斷點脂凶,那么就是Run的正常模式宪睹,如果創(chuàng)建了斷點并且運行到斷點處,就自動進入Debug模式咯蚕钦,不像某EC開頭的IDE亭病,控制面板就像開飛機的一樣,幾萬個按鈕以為很強大嘶居,其實只用了Run和Stop罪帖,還有什么Debug模式,App模式……邮屁,果然Xcode的優(yōu)越感在對比中更加強烈了整袁,舒服到極點呀,就像夏天的海風(fēng)拂過菊花佑吝,嗯是的 就是那種感覺坐昙!
我們創(chuàng)建好了斷點,運行到斷點就自動停下來了芋忿,像這樣:
圖6
這些Debug的最基本操作技能是每一個入門的iOS開發(fā)者都要掌握的炸客,應(yīng)該當(dāng)成一種本能疾棵,就像狗愛吃翔一樣(噢 對不起 博主不是歧視狗的意思,博主也養(yǎng)過狗痹仙,很二逼但是從不吃翔是尔!真的據(jù)我所知它從來不吃翔的,這里只是比喻只是比喻)蝶溶。
全局?jǐn)帱c(Global BreakPoint)
有時候在程序出錯的時候不能能準(zhǔn)確定位到奔潰的那一行代碼,而是直接跑到main循環(huán)或者Appdelegate里面嗜历, 或者會給你這樣的提示:
EXEC_BAD_ACCESS:
是不是有種想哭的沖動?尼瑪至少給我一些堆棧信息也好呀……這個時候你千萬不要砸鼠標(biāo)和鍵盤哦抖所,一切都是主機在運行梨州,你砸鼠標(biāo)和鍵盤有什么用呢?應(yīng)該是踢主機呀~~田轧,現(xiàn)在有了全局?jǐn)帱c暴匠,娘親再也不擔(dān)心你砸鼠標(biāo)了,你只需要這樣:
圖7
在Debug導(dǎo)航面板進行上圖的操作傻粘,你就建立了全局?jǐn)帱c每窖,這樣只要遇到錯誤,debug程序就會自動定位到棧底的信息弦悉,也就是你最先出錯的代碼的那一行窒典,這樣你就可以快樂的debug拉~~
條件斷點(Condational Breakpoints)
從前有一個游戲,叫做擼啊擼稽莉,有些玩家他們知道怎么操作瀑志,會放技能會走路,但是他們不知道買裝備污秆,玩了一局下來劈猪,鞋子小刀都沒有買。我為什么講這個故事呢良拼?因為很多小朋友學(xué)東西和玩游戲一樣战得,看完前面的幾種調(diào)試技能,就以為自己已經(jīng)屌爆無敵了庸推,其實他們不過是出門不帶裝備的玩家厚骗,如果只是使用了以上的調(diào)試技能只能說是低玩合搅,在高大的逼優(yōu)雞面前根本就是會被瞬秒的那種曾掂,所以學(xué)會裝備自己才是王道槐秧!條件斷點,就是學(xué)會有的放矢掖蛤!
我們來看一段代碼
圖8
你是不是想問博主為何那么風(fēng)騷杀捻,竟然上了Swift了!!我此刻只想吟一首濕:別人笑我太淫蕩致讥,我家住在黃鶴樓仅仆。
反正這個年代大家都是吃飽了撐著的,博主也是垢袱,所以就學(xué)學(xué)Swift咯墓拜。
我們?nèi)绻谝粋€循環(huán)里面使用了斷點,如果這個循環(huán)執(zhí)行了100萬次请契,那你的斷點要執(zhí)行那么多次咳榜,你不覺得蛋蛋都涼了的憂傷么?所以我們這么做:
圖9
這樣只有遍歷到c==“H”的時候 斷點才會被觸發(fā)爽锥。
圖10
是不是很棒呢涌韩!
有些童鞋的鈦合金狗眼已經(jīng)看到了編輯斷點那里有一個Action的東西,那是什么呢氯夷?
這個是非常強大的臣樱,可以在你斷點的位置,執(zhí)行各種操作腮考,比如執(zhí)行腳本命令雇毫,控制臺命令(可以制定調(diào)試信息自定義保存)、打印信息等踩蔚,
博主最喜歡的就是這個Log message啦棚放,簡單粗暴!根本就不需要print啊NSLog嘛馅闽,直接在斷點的Action打印就好了(其實這個是Xcode和調(diào)試器結(jié)合的高能產(chǎn)物飘蚯,下面再介紹)。具體可以這樣:
圖11
其實剛剛博主撒謊了捞蛋,博主最喜歡的Action并不是Log Message,而是Sound柬姚,顧名思義嘛拟杉,斷點射在Bug上,這樣遇到斷點就會發(fā)出聲音量承,聽到我自己設(shè)置的聲音搬设,我就知道是什么Bug了,聽聲識Bug撕捍,呵呵拿穴,EXEC_BAD_ACCESS的錯誤我設(shè)置成了波多野老師的聲音,unrecognized selector send to instancd的錯誤我設(shè)置成了蒼老師的…… 不要問我系統(tǒng)怎么沒有吉澤明步的聲音忧风,我根本就不知道誰是吉澤明步默色。
當(dāng)然還有更加強大的條件斷點就是這貨啦
圖12
添加之后在 Symbol 一欄輸入 viewDidLoad。
這樣一來狮腿,在程序中所有的 viewDidLoad 方法被調(diào)用時都會觸發(fā)斷點腿宰。
圖13
當(dāng)然呕诉,我們也可以僅僅為特定的某個類的方法添加斷點。在 Symbol 一欄輸入 [ClassName viewDidLoad] (Objective-C) 或 ClassName.viewDidLoad (Swift) 即可吃度。
比如:unrecognized selector sent to instance 0xaxxxx 這種錯誤甩挫,這個instance可以這樣快速定位
圖14
打印的藝術(shù)
盡管ARC已經(jīng)讓內(nèi)存管理變得簡單、省時和高效椿每,但是在object的life-cycles中跟蹤一些重要事件依然十分重要伊者。畢竟ARC并沒有完全排除內(nèi)存泄露的可能性,或者試圖訪問一個被release的對象间护。為了這個目的亦渗,我們可以很藝術(shù)地偷窺對象正在做些什么,想想就好有快感兑牡。
NSLog
小伙伴們第一節(jié)課學(xué)習(xí)ViewController的生命周期的時候央碟,老師肯定很猥瑣的教了大家,在viewController的每個生命周期的方法中使用了NSLog來偷窺均函!沒錯亿虽,這樣其實就是最簡單爆炸的跟蹤生命周期的方法了,不過系統(tǒng)自己的NSLog真心有點羸弱苞也,輸出的信息太少洛勉,根本就不能滿足我們的欲望,這里我教大家強化你的LogH绯佟收毫!
可以用下面的這段宏
//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ù)編譯指令的初步探究》
這樣打印出來的東西才像話嘛(其實NSLog的打印是非常低效的,甚至比print低100倍殷勘,感興趣自己翻翻蘋果手冊咯)此再。
使用objc語言(強類型)并且用NSLog打印的時候,常常搞不清楚NSLog(@“%?”,xxx) xxx這種類型該是什么什么類型輸出输拇,應(yīng)該是%d呢還是%@亦或是%f?贤斜?策吠?傻傻分不清楚~,所以玩轉(zhuǎn)NSLog你應(yīng)該要知道以下這幾個全局方法瘩绒!
圖17
開啟僵尸對象(Enable NSZombie Objects)
Xcode可以把那些已經(jīng)release掉得對象猴抹,變成“僵尸”,當(dāng)我們訪問一個Zombie對象時锁荔,Xcode可以告訴我們正在訪問的對象是一個不應(yīng)該存在的對象了蟀给。因為Xcode知道這個對象是什么,所以可以讓我們知道這個對象在哪里,以及這是什么時候發(fā)生的坤溃。
所以Zombies是你的好基友拍霜!他可以讓你輸出的信息更具體!薪介!
具體這樣做:
圖15
自己再試試輸出Object的信息咯祠饺,是不是很棒呢?
僵尸只能用在模擬器和OC語言哦~
進擊的碼農(nóng)
如果說你已經(jīng)把打印的藝術(shù)運用的風(fēng)生水起了汁政,并且斷點的使用可以信手拈來隨心所欲道偷,那么你已經(jīng)在與逼優(yōu)雞的對峙中,穩(wěn)操大部分勝券了记劈,你已經(jīng)是一個孤高冷艷的程序員了勺鸦,俯視一切低能的逼優(yōu)雞了!但是目木!面對更強大的敵人——你那禿頂1000°近視牙齒夾著韭菜的有著十年對戰(zhàn)逼優(yōu)雞的同事面前换途、以及笑里藏刀眼睛有眼屎但是能用眼神殺死你的面試官…… 對于他們,你還是太弱刽射,你的技能的磨練還太少军拟!所以你必須要進擊!誓禁!比逼優(yōu)雞還要強大的敵人出現(xiàn)了懈息!我們需要更強大的武器。
Console(lldb 命令)
我們的目標(biāo)是要武裝到鼻毛摹恰!console窗口大家知道就是哪個黑乎乎好多字會滾出來辫继,尤其是被逼優(yōu)雞干到的時候,那么同學(xué)們有沒有遇到這種console呢
圖16
我們家的編譯器歷史 敬請亂入 《iOS中的預(yù)編譯指令的初步探究》 俗慈,沒錯我們現(xiàn)在正在使用著世界上最好的c姑宽、c++、oc闺阱、swift的編譯器——LLVM,lldb就是這個世界上最好的LLVM的調(diào)試器炮车!不要害羞,因為我們是最優(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真的很強大,博主沒有騙你珊楼,這篇博文到此的所有調(diào)試技巧lldb都可以實現(xiàn)通殃,各種斷點,各種打印厕宗,調(diào)用python插件画舌,運行中斷,操作硬件底層已慢,控制程序運行線程……lldb都可以做到曲聂!仿佛lldb就是另一個強大的世界!S踊荨朋腋!
是不是強大到爆炸齐疙?
其實如果你不想貪多嚼不爛的話,你只要精通這個調(diào)試工具旭咽,基本前面的調(diào)試技能你可以不用學(xué)了贞奋,在這里博主也是不才,lldb的強大不是博主隨便說幾句就可以表達的出來的穷绵,
更多地需要大家事必躬親轿塔,才能真正體會到那種美好,那種暢快無比的調(diào)試體驗仲墨!
這里博主無私地掏出任意門催训,這里有很好的文章!可以讓你好好的回味宗收,呵呵
《The LLDB Debugger》
《About LLDB and Xcode》
《LLDB調(diào)試命令初探》
《與調(diào)試器共舞 - LLDB 的華爾茲》
Profile(instruments)
圖19
這個東西怎么翻譯呢漫拭?我們就叫檢查器吧!混稽!也許已經(jīng)學(xué)習(xí)了iOS開發(fā)大半年的你采驻,從來都沒注意到或者使用這個工具,但是博主很負(fù)責(zé)任的告訴你現(xiàn)在市面上任何一款出色的APP都會使用instruments來讓代碼更加健壯匈勋!難道instrument是春藥礼旅?怎么會使代碼健壯呢?
這個健壯不是那個健壯哎~ 我才18歲能不能清純一點呀
instrument里面包含了很多工具洽洁,內(nèi)存溢出分析痘系,性能分析,各種分析…… 如果細(xì)說的話饿自,這個真的可以為每個工具開一篇博客汰翠,但是博主是一個懂得授人以魚不如授人以漁的道理的老司機!所以博主當(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)對于你自己的項目的上百個warning已經(jīng)麻木了总放,但博主我負(fù)責(zé)人地告訴你呈宇,這樣不好!局雄,因為有一首云南民歌《老司機帶帶我》聽得博主神清氣爽甥啄!
堅守作為iOS開發(fā)者的貞操!跟著我高喊口號哎榴!
No Warning型豁!Pass Analyze!
我們繼續(xù)回來使用leaks尚蝌!如果analyze都通過了迎变,那么就可以使用leaks工具,發(fā)現(xiàn)千年老妖級別的側(cè)漏了飘言!
圖22
如果提示某一個對象有側(cè)漏的風(fēng)險衣形,你還可以這樣彈出側(cè)邊的拓展細(xì)節(jié)
圖23
直接點擊方法就可以直接進入代碼部分了!姿鸿!
是不是很簡單粗暴呢谆吴!當(dāng)然還很多其他工具,不過叫做篇幅的東西總是限制人苛预,誒 真蛋疼~真的還想多說點的
想要更多了解instrument 大家可以看看這篇文章句狼!
《How to Use Instruments in Xcode》
Xcode視圖調(diào)試
有時候有些逼優(yōu)雞隱藏的比較深,代碼幾乎都翻了個遍热某,還是沒找到問題出在哪腻菇,博主可以理解那種風(fēng)中凌亂,蛋碎一地的趕腳昔馋,因為無數(shù)個日夜博主就是深陷當(dāng)中無法自拔筹吐,后來干脆直接重新新建一個工程!還是不行C囟簟丘薛!我去,直到有一天博主早上起來邦危,看到鏡子中自己帥氣的臉龐洋侨,我才突然頓悟,原來長得帥可以那樣快速的找到bug倦蚪!最終鎖定是可愛又可恨的xib和storyboard出了問題;硕摇!某個constraint或者view的嵌套邏輯又或者團隊協(xié)作Git沖突等等問題审丘,導(dǎo)致io -v什么的錯誤吏够,這種情況去檢查視圖文件,可能xcode崩潰打不開那個xib或者storyboard滩报,你直接使用文本工具打開這個xml類型的標(biāo)記文件锅知,你差點吐血,幾萬行的記錄狗眼都看瞎了……脓钾。
但是這個歷史要被終結(jié)J鄱谩!因為我們強大的xcode的視圖調(diào)試功能?裳怠昌妹!
以下內(nèi)容捶枢,完全copy,如有不適飞崖,堅持看完烂叔!請叫我快樂的搬運工!
抄襲自《View Debugging in Xcode 6》
蘋果在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ù)視圖控制器的可點擊的應(yīng)用程序汇四、應(yīng)用程序委托以及一個storyboard。該app是為iPhone而設(shè)計,但受益于iOS 8的自適應(yīng)布局,所以界面展示在任何設(shè)備上都沒有問題羡棵。
您剛剛下載的應(yīng)用程序示例工程是一個簡單的to-do list應(yīng)用程序瓢喉,包含可查看其他信息的簡單屏幕戚绕,比如該示例工程中的項目數(shù)鉴逞,用戶頭像以及@***的推特操作。點擊Xcode左上角的運行按鈕將展示在iOS模擬器中運行的應(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ā)生改變時枚赡,表視圖會自動重新加載。通過查看以上代碼片段谓谦,你會發(fā)現(xiàn)應(yīng)該應(yīng)用中應(yīng)該有4個項目需要展示贫橙,但現(xiàn)在不展示數(shù)據(jù)就說明某些地方出現(xiàn)了差錯。
啟用視圖調(diào)試
問題似乎與用戶界面有關(guān)反粥。運行app過程中卢肃,按下底部的Debug View Hierarchy 按鈕,或者從菜單中選擇Debug > View Debugging > Capture View Hierarchy 來啟動視圖調(diào)試才顿。
圖25
啟動視圖調(diào)試后莫湘,Xcode會對應(yīng)用程序的視圖層次拍一個快照并展示三維原型視圖來探究用戶界面的層級。該三維視圖除了展示app的視圖層次外郑气,還展示每個視圖的位置幅垮、順序和視圖尺寸,以及視圖間的交互方式尾组。
示例工程在Xcode中的三維視圖展示正常忙芒,但表視圖單元格似乎有點太寬了示弓。
圖26
暫停應(yīng)用程序調(diào)試并在左側(cè)選中Main.Storyboard來修復(fù)問題。點擊表視圖并選中Editor > Resolve Auto Layout Issues > Reset to Suggested Constraints.
圖27
編譯并再次運行應(yīng)用程序以確定用戶界面展示正常呵萨。點擊Debug View Hierarchy按鈕更進一步了解視圖調(diào)試的功能奏属。
視圖調(diào)試功能
點擊并拖拽三維渲染圖的任意一邊,可旋轉(zhuǎn)或者傾斜用戶界面甘桑,向左或者向右傾斜可選中某個表視圖。
選中后歹叮,Xcode會高亮該視圖跑杭,并在會在右邊展示Object 和Size檢查器。查看在跳轉(zhuǎn)欄頂部并確認(rèn)UITableView是右邊最后一個項目咆耿。
圖28
Object 和 Size檢查器包括大量有用的信息德谅。過去開發(fā)者需要依賴日志語句或者斷點來檢查視圖的配置。
打開右邊的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)容,僅展示框架以及同時展示內(nèi)容和框架柒爸。
縮凶荚 :縮小3D渲染透視圖
恢復(fù):將3D渲染透視圖恢復(fù)至默認(rèn)尺寸。
放大:放大3D渲染透視圖
調(diào)整可視視圖范圍:隱藏視圖或展示視圖捎稚,一步步解析3D渲染視圖乐横,向左或者向右滑動滑塊兒有相反的效果。
建議花一點時間上手操作下這些空間今野,并理解各自的用處晰奖。
視圖層排序
再次編譯和運行應(yīng)用程序,并點擊用戶界面底部的"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ù)問題很簡單权她。運行時虹茶,Blur Effect View隱藏在Sky Image之下,因為它是視圖層次的第一個視圖隅要。在文檔概覽中點擊并拖拽 Blur Effect View蝴罪,結(jié)果會如下圖展示一樣:
圖33
再次運行應(yīng)用程序就能看到模糊效果了。應(yīng)用程序的用戶界面看起來符合設(shè)計的初衷步清。我們還可以查看iOS模擬器的其他調(diào)試功能洲炊,看看還完善了其他什么地方或功能。
5.iOS模擬器調(diào)試功能
編譯并運行應(yīng)用程序尼啡,選中模擬器暂衡,從 Debug菜單中選擇Color Blended Layers選項。
圖34
然后會看到app的用戶界面被紅色和綠色覆蓋崖瞭,顯示了哪些圖層可以被疊加覆蓋狂巢,以及哪些圖層是透明的∈榫郏混合層屬于計算密集型視圖唧领,所以推薦盡可能地使用不透明的圖層。
圖35
蘋果在其文檔(iOS Simulator User Guide)中對此進行了注明雌续,并在表視圖處理上使用了不透明圖層斩个。滾動視圖時會有些表現(xiàn)不大好的地方,一個重要的原因就是使用了混合圖層驯杜,而如果內(nèi)容背景是不透明層受啥,那么頁面滾動效果就會非常流暢和平穩(wěn)。
對于這款應(yīng)用程序來說,假使用戶有數(shù)百個項目要展示滚局,可能會出現(xiàn)滾動性能不一致的情況居暖。表視圖單元格當(dāng)前使用的是混合層。由于視圖控制器的視圖背景是白色藤肢,所以不管表視圖單元格使用的是混合層或者不透明層太闺,終端用戶不會覺察到有什么不一樣。
打開Main.storyboard并選中To Do list Scene中的表視圖單元格屬性嘁圈。在屬性檢查器(Attributes Inspector)中省骂,向下滾動Drawing分區(qū)并勾選Opaque。
圖36
在啟用Color Blended Layers的狀態(tài)下編譯并運行應(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中動畫的運行速度览妖,適合調(diào)試包含復(fù)雜動畫的應(yīng)用程序轧拄。也可是使用快捷鍵Command-T來操作。
Color Copied Images:該選項可以給繪制時被Core Animation復(fù)制的圖片添加藍綠色疊加層讽膏。
Color Misaligned Images:如果圖片邊界沒有與目標(biāo)像素完美對齊檩电,該功能可為圖片疊加上一層品紅色。如果圖片使用確定的比例大小繪制府树,那么該功能會為圖片添加一層黃色疊加俐末。
Color Off Screen Rendered:.該選項為離屏渲染內(nèi)容添加一個黃色的疊加層。
很多開發(fā)者會忽略接入電話時應(yīng)用狀態(tài)欄的設(shè)計問題奄侠,你可以通過觸發(fā)通話中狀態(tài)欄來簡單測試卓箫。在iOS模擬器中,從Hardware菜單中選中Toggle In-Call Status Bar垄潮。
想查看app如何響應(yīng)事件烹卒,可按下Command-T來啟用slow animations,并按下Command-Y來展示電話接入時的狀態(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é)省不少時間。視圖調(diào)試可以幫你修正很多用戶界面中出現(xiàn)的問題潦闲。
除了Xcode和InterfaceBuilder之外攒菠,使用iOS模擬器的調(diào)試功能可以提升應(yīng)用性能和識別開發(fā)過程中的瓶頸。蘋果的人機交互指南(中文版 英文版)強調(diào)了積極響應(yīng)對app的重要性歉闰,能讓用戶覺得應(yīng)用易于使用和操作辖众。蘋果對InterfaceBuilder的提升讓視圖調(diào)試變得前所未有的簡單。