XCODE Debug模式資料整理
在iOS開發(fā)中, 大多時候需要在debug 模式下調(diào)試,這里就整理下Debug 的知識
1,Debug和Release版本區(qū)別?
眾所周知,我們進行iOS開發(fā),在Xcode調(diào)試程序時,分為兩種方式, Debug 和 Release ,在Target的Setting中相信大家應(yīng)該看到很多選項都分為 Debug 和 Release ,方便我們分別設(shè)置,滿足調(diào)試和發(fā)布的不同需求。
Release是發(fā)行版本,比Debug版本有一些優(yōu)化,文件比Debug文件小 Debug是調(diào)試版本,Debug和Release調(diào)用兩個不同的底層庫。通俗點講,我們開發(fā)者自己內(nèi)部真機或模擬器調(diào)試時,使用Debug模式就好,等到想要發(fā)布時,也就是說需要大眾客戶使用時,需要build Release版本,具體區(qū)別如下:
一、Debug是調(diào)試版本,包括的程序信息更多
二、只有Debug版的程序才能設(shè)置斷點、單步執(zhí)行、使用TRACE/ASSERT等調(diào)試輸出語句
三、Release不包含任何調(diào)試信息,所以
體積小、運行速度快
抽刀斷Bug
斷點,(我求你們不要想到張敬軒,阿軒他容易么,小受又怎么了?你們這幫人真是的?。。?,我要說的斷點是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了?。∥掖丝讨幌胍饕皇诐瘢簞e人笑我太淫蕩,我家住在黃鶴樓。
反正這個年代大家都是吃飽了撐著的,博主也是,所以就學(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真心有點羸弱,輸出的信息太少,根本就不能滿足我們的欲望,這里我教大家強化你的Log?。?br /> 可以用下面的這段宏
//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就是另一個強大的世界!??!
是不是強大到爆炸?
其實如果你不想貪多嚼不爛的話,你只要精通這個調(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)中無法自拔,后來干脆直接重新新建一個工程!還是不行!!我去,直到有一天博主早上起來,看到鏡子中自己帥氣的臉龐,我才突然頓悟,原來長得帥可以那樣快速的找到bug!最終鎖定是可愛又可恨的xib和storyboard出了問題??!某個constraint或者view的嵌套邏輯又或者團隊協(xié)作Git沖突等等問題,導(dǎo)致io -v什么的錯誤,這種情況去檢查視圖文件,可能xcode崩潰打不開那個xib或者storyboard,你直接使用文本工具打開這個xml類型的標(biāo)記文件,你差點吐血,幾萬行的記錄狗眼都看瞎了……。
但是這個歷史要被終結(jié)!!因為我們強大的xcode的視圖調(diào)試功能?。?/p>
以下內(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的用戶界面被紅色和綠色覆蓋,顯示了哪些圖層可以被疊加覆蓋,以及哪些圖層是透明的?;旌蠈訉儆谟嬎忝芗鸵晥D,所以推薦盡可能地使用不透明的圖層。
圖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)試變得前所未有的簡單。
結(jié)語
這篇文章博主花了3個禮拜,斷斷續(xù)續(xù)才寫完的,當(dāng)中錯漏應(yīng)該非常多,但是無論如何鄙人覺得應(yīng)該算是配的上豪華套餐的稱號了,當(dāng)中iOS開發(fā)的基本、常用以及高階的調(diào)試技能都涉及了,但是仍然有很多其他的奇門巧技沒有介紹到,主要是可惡的“篇幅”限制住了博主廣博的愛,但是無論如何,這篇文章大家暫且可以當(dāng)做是一個調(diào)試技術(shù)的目錄,因為博主在這里寫的講的很粗淺。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
iOS開發(fā)學(xué)習(xí)TableView展現(xiàn)一個list實例
這篇文章主要為大家介紹了iOS系列學(xué)習(xí)TableView展現(xiàn)一個list實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11iOS實現(xiàn)去除html標(biāo)簽的方法匯總
相信大家在做網(wǎng)站的時候,經(jīng)常會遇到去除html標(biāo)簽的問題,下面這篇文章主要給大家總結(jié)介紹了關(guān)于iOS如何實現(xiàn)去除html標(biāo)簽的一些方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10詳解IOS判斷當(dāng)前網(wǎng)絡(luò)狀態(tài)的三種方法
這篇文章主要介紹了詳解IOS判斷當(dāng)前網(wǎng)絡(luò)狀態(tài)的三種方法,網(wǎng)絡(luò)狀態(tài)是非常重要的知識,感興趣的同學(xué),必須要看一下2021-04-04