作者原文鏈接:?點這里
一仰税、普通操作:
1.打斷點
當然也還可以監(jiān)視某個變量!
在對象視圖中遮糖,右鍵某個對象麻汰,點擊“Watch ‘XXX’”就完成XXX對象的監(jiān)視了速客。這里我監(jiān)視了lab這個UILabel的變量,每當這個變量進行更新它的信息就會被打印到控制臺五鲫。
2. 全局斷點
有時候在程序出錯的時候不能能準確定位到奔潰的那一行代碼,而是直接跑到main循環(huán)或者Appdelegate里面溺职, 或者會給你這樣的提示:
EXEC_BAD_ACCESS:
這時,我們可以通過全局斷點來調(diào)試
在Debug導(dǎo)航面板進行上圖的操作,你就建立了全局斷點位喂,這樣只要遇到錯誤浪耘,debug程序就會自動定位到棧底的信息,也就是你最先出錯的代碼的那一行塑崖,這樣你就可以快樂的debug拉~~
3.條件斷點
這樣只有遍歷到c==“H”的時候 斷點才會被觸發(fā).
編輯斷點那里有一個Action的東西七冲,那是什么呢?
這個是非常強大的规婆,可以在你斷點的位置澜躺,執(zhí)行各種操作,比如執(zhí)行腳本命令聋呢,控制臺命令(可以制定調(diào)試信息自定義保存)苗踪、打印信息等颠区,博主最喜歡的就是這個Log message啦削锰,簡單粗暴!根本就不需要print啊,NSLog嘛毕莱,直接在斷點的Action打印就好了(其實這個是Xcode和調(diào)試器結(jié)合的高能產(chǎn)物器贩,下面再介紹)颅夺。具體可以這樣:
當然還有更加強大的條件斷點就是這貨啦
當然,我們也可以僅僅為特定的某個類的方法添加斷點蛹稍。在 Symbol 一欄輸入 [ClassName viewDidLoad] (Objective-C) 或 ClassName.viewDidLoad (Swift) 即可吧黄。
比如:unrecognized selector sent to instance 0xaxxxx 這種錯誤,這個instance可以這樣快速定位
二唆姐、打印的藝術(shù)
盡管ARC已經(jīng)讓內(nèi)存管理變得簡單拗慨、省時和高效,但是在object的life-cycles中跟蹤一些重要事件依然十分重要奉芦。畢竟ARC并沒有完全排除內(nèi)存泄露的可能性赵抢,或者試圖訪問一個被release的對象。為了這個目的声功,我們可以很藝術(shù)地偷窺對象正在做些什么烦却,想想就好有快感。
盡管ARC已經(jīng)讓內(nèi)存管理變得簡單先巴、省時和高效其爵,但是在object的life-cycles中跟蹤一些重要事件依然十分重要。畢竟ARC并沒有完全排除內(nèi)存泄露的可能性伸蚯,或者試圖訪問一個被release的對象摩渺。為了這個目的,我們可以很藝術(shù)地偷窺對象正在做些什么剂邮,想想就好有快感证逻。
可以用下面的這段宏:
#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)
使用objc語言(強類型)并且用NSLog打印的時候,常常搞不清楚NSLog(@“%?”,xxx) xxx這種類型該是什么什么類型輸出抗斤,應(yīng)該是%d呢還是%@亦或是%f囚企??瑞眼?傻傻分不清楚~龙宏,所以玩轉(zhuǎn)NSLog你應(yīng)該要知道以下這幾個全局方法!
1. 開啟僵尸對象
Xcode可以把那些已經(jīng)release掉得對象伤疙,變成“僵尸”银酗,當我們訪問一個Zombie對象時,Xcode可以告訴我們正在訪問的對象是一個不應(yīng)該存在的對象了徒像。因為Xcode知道這個對象是什么黍特,所以可以讓我們知道這個對象在哪里,以及這是什么時候發(fā)生的锯蛀。?所以Zombies是你的好基友灭衷!他可以讓你輸出的信息更具體!旁涤!
2. Console(lldb 命令)
3. Profile(instruments)
instrument里面包含了很多工具翔曲,內(nèi)存溢出分析迫像,性能分析,各種分析…… 如果細說的話瞳遍,這個真的可以為每個工具開一篇博客闻妓,但是博主是一個懂得授人以魚不如授人以漁的道理的老司機!所以博主當然不會全部說一遍掠械!我們就來領(lǐng)著大家看看專用debug的內(nèi)存溢出分析工具的使用吧由缆!
如果提示某一個對象有側(cè)漏的風(fēng)險,你還可以這樣彈出側(cè)邊的拓展細節(jié)
4. xcode視圖調(diào)試
var mockNotesDataSource:[String]=[
"Do some laundry",
"Finish homework",
"Walk the dog",
"Learn about view debugging"]{didSet{self.tableView.reloadData()}}
5. 啟用視圖調(diào)試
問題似乎與用戶界面有關(guān)猾蒂。運行app過程中犁功,按下底部的Debug View Hierarchy 按鈕,或者從菜單中選擇Debug > View Debugging > Capture View Hierarchy 來啟動視圖調(diào)試婚夫。
示例工程在Xcode中的三維視圖展示正常浸卦,但表視圖單元格似乎有點太寬了。
暫停應(yīng)用程序調(diào)試并在左側(cè)選中Main.Storyboard來修復(fù)問題案糙。點擊表視圖并選中Editor > Resolve Auto Layout Issues > Reset to Suggested Constraints.
編譯并再次運行應(yīng)用程序以確定用戶界面展示正常限嫌。點擊Debug View Hierarchy按鈕更進一步了解視圖調(diào)試的功能。
6. 視圖調(diào)試功能
點擊并拖拽三維渲染圖的任意一邊时捌,可旋轉(zhuǎn)或者傾斜用戶界面怒医,向左或者向右傾斜可選中某個表視圖。
選中后奢讨,Xcode會高亮該視圖稚叹,并在會在右邊展示Object 和Size檢查器。查看在跳轉(zhuǎn)欄頂部并確認UITableView是右邊最后一個項目拿诸。
Object 和 Size檢查器包括大量有用的信息扒袖。過去開發(fā)者需要依賴日志語句或者斷點來檢查視圖的配置。
打開右邊的Size inspector(規(guī)格檢查器)亩码,下方是Auto Layout季率,可以看到視圖上已經(jīng)應(yīng)用了正確的約束。在Object inspector中描沟,我們可以檢查所選視圖的屬性飒泻。
在Xcode的調(diào)試區(qū)有9個視圖調(diào)試過程中要用到的按鈕和滑塊兒。
從左到右控件排序:
調(diào)整視圖間距:調(diào)整不同視圖間的間距吏廉。
展示被剪切的內(nèi)容:當前展示視圖中被剪切的部分泞遗。
展示約束:展示選中視圖的約束。
重置查看區(qū)域:將3D渲染透視圖恢復(fù)至默認狀態(tài)席覆。
調(diào)整查看模式:選擇性地展示3D渲染透視圖史辙,比如僅展示內(nèi)容,僅展示框架以及同時展示內(nèi)容和框架。
縮兴柘肌:縮小3D渲染透視圖
恢復(fù):將3D渲染透視圖恢復(fù)至默認尺寸。
放大:放大3D渲染透視圖
調(diào)整可視視圖范圍:隱藏視圖或展示視圖畦戒,一步步解析3D渲染視圖方库,向左或者向右滑動滑塊兒有相反的效果。
建議花一點時間上手操作下這些空間障斋,并理解各自的用處纵潦。
7. 視圖層排序
再次編譯和運行應(yīng)用程序,并點擊用戶界面底部的"More"標簽垃环。第一眼看去界面看起來還OK邀层,但是它沒有按照開發(fā)者的定義準確執(zhí)行,圖片上的模糊效果沒有展示出來遂庄。我們可以通過調(diào)試視圖層次來更好地確定問題所在寥院。
向左或者向右拖拽視圖來查看具體情況,接著將view spacing slider向右拖動涛目。
這樣一來秸谢,不同視圖間的間距變大了,層次也更加清晰霹肝,我們看到在圖片"下方"還隱藏著另一個視圖估蹄,選中隱藏的視圖,它就是"丟失"的視覺效果視圖.
打開Main.storyboard 并選中Second View Controller Scene沫换。在左側(cè)的文檔概覽面板中臭蚁,展開Second View Controller的視圖對象以查看子視圖的排序。
Xcode在文檔概覽中按照遞升順序堆疊視圖讯赏,換句話說垮兑,列表頂層的視圖是視圖層次的基礎(chǔ)。
修復(fù)問題很簡單漱挎。運行時甥角,Blur Effect View隱藏在Sky Image之下,因為它是視圖層次的第一個視圖识樱。在文檔概覽中點擊并拖拽 Blur Effect View嗤无,結(jié)果會如下圖展示一樣:
再次運行應(yīng)用程序就能看到模糊效果了。應(yīng)用程序的用戶界面看起來符合設(shè)計的初衷怜庸。我們還可以查看iOS模擬器的其他調(diào)試功能当犯,看看還完善了其他什么地方或功能。
8. 模擬器調(diào)試
編譯并運行應(yīng)用程序割疾,選中模擬器嚎卫,從 Debug菜單中選擇Color Blended Layers選項.
然后會看到app的用戶界面被紅色和綠色覆蓋,顯示了哪些圖層可以被疊加覆蓋,以及哪些圖層是透明的拓诸∏值瑁混合層屬于計算密集型視圖,所以推薦盡可能地使用不透明的圖層奠支。
蘋果在其文檔(iOS Simulator User Guide)中對此進行了注明馋辈,并在表視圖處理上使用了不透明圖層。滾動視圖時會有些表現(xiàn)不大好的地方倍谜,一個重要的原因就是使用了混合圖層迈螟,而如果內(nèi)容背景是不透明層,那么頁面滾動效果就會非常流暢和平穩(wěn)尔崔。
對于這款應(yīng)用程序來說答毫,假使用戶有數(shù)百個項目要展示,可能會出現(xiàn)滾動性能不一致的情況季春。表視圖單元格當前使用的是混合層洗搂。由于視圖控制器的視圖背景是白色,所以不管表視圖單元格使用的是混合層或者不透明層载弄,終端用戶不會覺察到有什么不一樣蚕脏。
打開Main.storyboard并選中To Do list Scene中的表視圖單元格屬性。在屬性檢查器(Attributes Inspector)中侦锯,向下滾動Drawing分區(qū)并勾選Opaque驼鞭。
在啟用Color Blended Layers的狀態(tài)下編譯并運行應(yīng)用程序。由于表視圖單元格現(xiàn)在使用了不透明層尺碰,所以會用綠色覆蓋挣棕,以指示它們是不透明的。
除了標記圖層外亲桥,還有其他一些有用的功能可幫開發(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:如果圖片邊界沒有與目標像素完美對齊,該功能可為圖片疊加上一層品紅色葫笼。如果圖片使用確定的比例大小繪制深啤,那么該功能會為圖片添加一層黃色疊加。
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)會為你兼顧到這一塊兒.
除了給視圖著色外,還要記住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)試變得前所未有的簡單喳魏。