上次我們聊完了iOS 的常用 UI 組件,不知道你是否已經可以製作一些簡單的 UI 界面了呢~
但是,在實踐的過程中很難不遇到 BUG,或者結果很難直接符合預期,這個時候我們就需要用到調試功能了!
接下來,讓我們進入從《蝦票票》帶你入門 iOS 系列(4)——Xcode 調試。
⚠️:本節包含的調試技巧並不局限於 iOS 開發,應該大部分 IDE 中都包含這些功能。
甜:斷點相關#
添加斷點#
添加斷點很簡單,在代碼對應行號處上單擊即可;刪除斷點時,通過將斷點標記拖出區域即可。
條件斷點#
右鍵斷點 - Edit Breakpoint,填寫合適的 Condition,則運行到斷點處時,只有符合 Condition 時才觸發斷點,暫停⏸️代碼運行。
斷點處自動執行任務#
右鍵斷點 - Edit Breakpoint,添加 Action,如 p cnt
(調試命令類型),即在經過該斷點時,打印 cnt
變量。
勾選下面的 Options,即可在執行上述 Action 後繼續運行代碼,而不暫停。
斷點忽略#
右鍵斷點 - Edit Breakpoint,如紅框所示,則會忽略第 1 次觸發斷點的情況,在第 2 次觸發斷點時才會暫停,一般用於忽略初始化的情況。
異常斷點#
在斷點導航欄的左下方可以添加異常類型的斷點。
當發生異常時,則不會導致 Crash,而是在即將 Crash 處暫停,此時可以很清晰地查看調用堆棧(詳見下一小節介紹),定位 Crash 根源。
符號斷點#
在斷點導航欄的左下方可以添加符號類型的斷點,設置 Symbol 為某種類型的方法,如 - [UIViewController viewDidLoad]
,即設置了該類方法的通用斷點,而不需要在每個調用處添加斷點。
PS:參考Xcode 高級調試技巧,你知道嗎?—— 簡書
酸:調用堆棧查看#
進入斷點時,有3 種方式查看當前的調用堆棧。
斷點導航欄#
斷點導航欄區域顯示了所有線程以及每個線程中的方法調用堆棧,0 代表棧頂方法,即當前方法,數字大的調用數字小的。
PS:上圖中省略的方法 2~28 調用的是 iOS 系統底層,因為 iOS 並不是開源的,所以看不到底層的調用堆棧。
下方工具欄#
下方工具欄的項目名稱處展示了與斷點導航欄相同的效果。
調試區域#
調試區域可以通過輸入 thread backtrace
命令,以文本方式展示當前調用堆棧。
此外,還可以通過 thread info [i]
查看線程 i
的基本信息。
PS:參考iOS 打印函數調用棧,查看變量在何處調用——CSDN
辣:3D 視圖層級檢查#
在使用 App 時,點擊下方工具欄的紅框按鈕,即可查看 App 當前界面(見下圖左邊模擬器)的 3D 視圖層級(見下圖右邊 3D 圖)。
通過下方工具欄,從左至右,我們可以:調節視圖層級之間的距離遠近|展示被裁減的內容、展示約束、改變視圖模式、改變背景|選擇 2D/3D 視圖|縮放|調整可視視圖的範圍。
此外,右鍵某一個圖層,選項如下圖,點擊Reveal in Debug Navigator,即可查看該圖層在所有圖層中的位置,方便捋清圖層之間的嵌套關係。
總的來說,3D 視圖層級檢查非常適合檢查 UI 問題。
好了,短暫的時光總是這麼短暫,這期是不是非常簡短又實用呢?尤其是斷點的一些高級調試技巧。
👏希望對你有所幫助,歡迎留言交流!
下周再見#
我們再來瞅瞅《蝦票票》App:
可以看到,除了 UI 界面,它還包含這些功能:拉取網絡電影數據,下拉刷新,上拉加載更多,菊花 loading 交互等等。那麼這些功能是不是很難實現哇?👀
也許它們是很難實現,但這並不重要,網上有很多開源的第三方庫,它們已經實現了上述功能,我們只要會拉取它們並使用即可。
這也就是我們下周要聊的內容了:CocoaPods——iOS 開發的第三方庫依賴管理工具。
🎺敬請期待。
——湖南降溫太快了,回深圳避寒🚄
2021.10.9