斷點,我要說的斷點是BreakPoint!基本上不是殘廢的IDE都具備斷點調試功能吧!尤爲是XCode,咱們家的IDE斷點調試功能但是強中又是強中手!在這以前你們能夠先了解一下哈子是斷點?它怎麼實現的?工做原理怎麼樣的?html
點擊那個黑列列就建立了一個斷點,再次點擊就臨時取消這個斷點(可是不刪除),長按那個斷點拖出去就刪除了(mac os的系統工程師就是稀飯拖動的快感),固然也能夠右鍵那個建立的斷點,會彈出相應地菜單。
固然也還能夠監視某個變量!python
在對象視圖中,右鍵某個對象,點擊「Watch ‘XXX’」就完成XXX對象的監視了。c++
這裏我監視了lab這個UILabel的變量,每當這個變量進行更新它的信息就會被打印到控制檯。
好吧!咱們最基本的建立斷點的工做已經學會了,Xcode舒服在什麼地方呢?就是不分Debug模式和Run模式的,能夠說是無縫切換的,你只要沒有建立斷點,那麼就是Run的正常模式,若是建立了斷點而且運行到斷點處,就自動進入Debug模式咯,不像某EC開頭的IDE,控制面板就像開飛機的同樣,幾萬個按鈕覺得很強大,其實只用了Run和Stop,還有什麼Debug模式,App模式……,果真Xcode的優越感在對比中更增強烈了,舒服到極點呀,就像夏天的海風拂過菊花,嗯是的 就是那種感受!
咱們建立好了斷點,運行到斷點就自動停下來了,像這樣:git
這些Debug的最基本操做技能是每個入門的IOS開發者都要掌握的github
有時候在程序出錯的時候不能能準肯定位到奔潰的那一行代碼,而是直接跑到main循環或者Appdelegate裏面, 或者會給你這樣的提示:swift
在Debug導航面板進行上圖的操做,你就創建了全局斷點,這樣只要遇到錯誤,debug程序就會自動定位到棧底的信息,也就是你最早出錯的代碼的那一行,這樣你就能夠快樂的debug拉~~xcode
咱們來看一段代碼app
咱們若是在一個循環裏面使用了斷點,若是這個循環執行了100萬次,那你的斷點要執行那麼屢次,你不以爲蛋蛋都涼了的憂傷麼?因此咱們這麼作:框架
這樣只有遍歷到c==「H」的時候 斷點纔會被觸發。ide
是否是很棒呢!
有些童鞋的鈦合金狗眼已經看到了編輯斷點那裏有一個Action的東西,那是什麼呢?
這個是很是強大的,能夠在你斷點的位置,執行各類操做,好比執行腳本命令,控制檯命令(能夠制定調試信息自定義保存)、打印信息等,
博主最喜歡的就是這個Log message啦,簡單粗暴!根本就不須要print啊NSLog嘛,直接在斷點的Action打印就行了(其實這個是Xcode和調試器結合的高能產物,下面再介紹)。具體能夠這樣:
固然還有更增強大的條件斷點就是這貨啦
添加以後在 Symbol 一欄輸入 viewDidLoad。
這樣一來,在程序中全部的 viewDidLoad 方法被調用時都會觸發斷點。
固然,咱們也能夠僅僅爲特定的某個類的方法添加斷點。在 Symbol 一欄輸入 [ClassName viewDidLoad] (Objective-C) 或 ClassName.viewDidLoad (Swift) 便可。
好比:unrecognized selector sent to instance 0xaxxxx 這種錯誤,這個instance能夠這樣快速定位
儘管ARC已經讓內存管理變得簡單、省時和高效,可是在object的life-cycles中跟蹤一些重要事件依然十分重要。畢竟ARC並無徹底排除內存泄露的可能性,或者試圖訪問一個被release的對象。爲了這個目的,咱們能夠很藝術地偷窺對象正在作些什麼,想一想就好有快感。
小夥伴們第一節課學習ViewController的生命週期的時候,老師確定很猥瑣的教了你們,在viewController的每一個生命週期的方法中使用了NSLog來偷窺!沒錯,這樣其實就是最簡單爆炸的跟蹤生命週期的方法了,不過系統本身的NSLog真心有點羸弱,輸出的信息太少,根本就不能知足咱們的慾望,這裏我教你們強化你的Log!!
能夠用下面的這段宏
Xcode能夠把那些已經release掉得對象,變成「殭屍」,當咱們訪問一個Zombie對象時,Xcode能夠告訴咱們正在訪問的對象是一個不該該存在的對象了。由於Xcode知道這個對象是什麼,因此可讓咱們知道這個對象在哪裏,以及這是何時發生的。
因此Zombies是你的好基友!他可讓你輸出的信息更具體!!
具體這樣作:
本身再試試輸出Object的信息咯,是否是很棒呢?
殭屍只能用在模擬器和OC語言哦~
咱們的目標是要武裝到鼻毛!console窗口你們知道就是哪一個黑乎乎好多字會滾出來,尤爲是被逼優雞幹到的時候,那麼同窗們有沒有遇到這種console呢
咱們家的編譯器歷史 敬請亂入 《IOS中的預編譯指令的初步探究》 ,沒錯咱們如今正在使用着世界上最好的c、c++、oc、swift的編譯器——LLVM,lldb就是這個世界上最好的LLVM的調試器!不要害羞,由於咱們是最優秀的!因此確定要用最好的!千萬別客氣喲,隨便用,就像本身家同樣啊,啊 哈哈 吃吃吃 別隻顧着吃飯,多夾菜……哎~博主好客的職業病又犯了~,什麼?你不知道在哪裏用lldb?
首先!你得先crash或者把程序斷下來!直到你看到圖16的(lldb)字樣出現,你就能夠敲命令了~~
每次你想查看變量,常量,你要從新寫NSLog去打印,而後從新編譯,去執行,重頭開始?太累了,有了lldb你只要這樣
是否是方便到爆炸?
當你有一個switch語句,你爲了測試每個case,你都要製造假條件去測試;有一個if…else…語句,你爲了測試不一樣的狀況,你要硬編碼寫了不一樣的狀況,編譯好幾回爲了測試每種狀況……,我想你應該知道爲何本身的頭髮那麼稀疏了。
以上的這些狀況,只需一次編譯,使用lldb的thread命令,僞造返回值,欺騙寄存器,就能夠爲所欲爲的作完全部測試了。
是否是牛逼到爆炸?
lldb真的很強大,博主沒有騙你,這篇博文到此的全部調試技巧lldb均可以實現,各類斷點,各類打印,調用python插件,運行中斷,操做硬件底層,控制程序運行線程……lldb均可以作到!彷彿lldb就是另外一個強大的世界!!!
是否是強大到爆炸?
其實若是你不想貪多嚼不爛的話,你只要精通這個調試工具,基本前面的調試技能你能夠不用學了,在這裏博主也是不才,lldb的強大不是博主隨便說幾句就能夠表達的出來的,
更多地須要你們事必躬親,才能真正體會到那種美好,那種暢快無比的調試體驗!
這裏博主無私地掏出任意門,這裏有很好的文章!可讓你好好的回味,呵呵
這個東西怎麼翻譯呢?咱們就叫檢查器吧!!也許已經學習了IOS開發大半年的你,歷來都沒注意到或者使用這個工具,可是博主很負責任的告訴你如今市面上任何一款出色的APP都會使用instruments來讓代碼更加健壯!
instrument裏面包含了不少工具,內存溢出分析,性能分析,各類分析…… 若是細說的話,這個真的能夠爲每一個工具開一篇博客,可是博主是一個懂得授人以魚不如授人以漁的道理的老司機!因此博主固然不會所有說一遍!咱們就來領着你們看看專用debug的內存溢出分析工具的使用吧!
在使用leaks以前你們能夠試試這個「Analyze」
analyze能夠快速的發現你的代碼中release的問題,以及繼承過程當中的父類方法缺失等等問題!通常一個優秀的IOS開發工程師No Warning、Pass Analyze是最基本的操守!我知道你已經對於你本身的項目的上百個warning已經麻木了,但博主我負責人地告訴你,這樣很差!
咱們繼續回來使用leaks!若是analyze都經過了,那麼就可使用leaks工具,發現千年老妖級別的側漏了!
若是提示某一個對象有側漏的風險,你還能夠這樣彈出側邊的拓展細節
直接點擊方法就能夠直接進入代碼部分了!!
是否是很簡單粗暴呢!固然還不少其餘工具,不過叫作篇幅的東西老是限制人,誒 真蛋疼~真的還想多說點的
想要更多瞭解instrument 你們能夠看看這篇文章!
最終鎖定是可愛又可恨的xib和storyboard出了問題!!某個constraint或者view的嵌套邏輯又或者團隊協做Git衝突等等問題,致使io -v什麼的錯誤,這種狀況去檢查視圖文件,可能xcode崩潰打不開那個xib或者storyboard,你直接使用文本工具打開這個xml類型的標記文件,你差點吐血,幾萬行的記錄狗眼都看瞎了……。
可是這個歷史要被終結!!由於咱們強大的xcode的視圖調試功能!!
如下內容,徹底copy,若有不適,堅持看完!請叫我快樂的搬運工!
抄襲自《View Debugging in Xcode 6》
蘋果在Xcode 6中作了很多明顯的改善和優化,視圖調試就是其中之一。一般,App用戶界面的行爲不會符合開發者指望的那樣,好比或者不展現視圖,或者沒有正確地展現。本文講解如何使用Xcode的新的視圖調試功能來簡化開發者對問題界面的確認和修復。
1.Demo 工程
開始之初先從github(https://github.com/tutsplus/ViewDebugging)上下載示例工程並打開ViewDebugging.xcodeproj。該工程包含一個簡單的包含少數視圖控制器的可點擊的應用程序、應用程序委託以及一個storyboard。該app是爲iPhone而設計,但受益於iOS 8的自適應佈局,因此界面展現在任何設備上都沒有問題。
您剛剛下載的應用程序示例工程是一個簡單的to-do list應用程序,包含可查看其餘信息的簡單屏幕,好比該示例工程中的項目數,用戶頭像以及@***的推特操做。點擊Xcode左上角的運行按鈕將展現在iOS模擬器中運行的應用程序。
很快會注意到用戶界面中存在問題-表視圖中沒有展現任何數據。在工程導航面板中打開FirstViewController.swift並找到如下代碼:
能夠看到mockNotesDataSource變量是表視圖的數據源。使用Swift的屬性觀察者功能,在數據源發生改變時,表視圖會自動從新加載。經過查看以上代碼片斷,你會發現應該應用中應該有4個項目須要展現,但如今不展現數據就說明某些地方出現了差錯。
啓用視圖調試
問題彷佛與用戶界面有關。運行app過程當中,按下底部的Debug View Hierarchy 按鈕,或者從菜單中選擇Debug > View Debugging > Capture View Hierarchy 來啓動視圖調試。
啓動視圖調試後,Xcode會對應用程序的視圖層次拍一個快照並展現三維原型視圖來探究用戶界面的層級。該三維視圖除了展現app的視圖層次外,還展現每一個視圖的位置、順序和視圖尺寸,以及視圖間的交互方式。
示例工程在Xcode中的三維視圖展現正常,但表視圖單元格彷佛有點太寬了。
暫停應用程序調試並在左側選中Main.Storyboard來修復問題。點擊表視圖並選中Editor > Resolve Auto Layout Issues > Reset to Suggested Constraints.
編譯並再次運行應用程序以肯定用戶界面展現正常。點擊Debug View Hierarchy按鈕更進一步瞭解視圖調試的功能。
視圖調試功能
點擊並拖拽三維渲染圖的任意一邊,可旋轉或者傾斜用戶界面,向左或者向右傾斜可選中某個表視圖。
選中後,Xcode會高亮該視圖,並在會在右邊展現Object 和Size檢查器。查看在跳轉欄頂部並確認UITableView是右邊最後一個項目。
Object 和 Size檢查器包括大量有用的信息。過去開發者須要依賴日誌語句或者斷點來檢查視圖的配置。
打開右邊的Size inspector(規格檢查器),下方是Auto Layout,能夠看到視圖上已經應用了正確的約束。在Object inspector中,咱們能夠檢查所選視圖的屬性。
從左到右控件排序:
調整視圖間距:調整不一樣視圖間的間距。
展現被剪切的內容:當前展現視圖中被剪切的部分。
展現約束:展現選中視圖的約束。
重置查看區域:將3D渲染透視圖恢復至默認狀態。
調整查看模式:選擇性地展現3D渲染透視圖,好比僅展現內容,僅展現框架以及同時展現內容和框架。
縮小:縮小3D渲染透視圖
恢復:將3D渲染透視圖恢復至默認尺寸。
放大:放大3D渲染透視圖
調整可視視圖範圍:隱藏視圖或展現視圖,一步步解析3D渲染視圖,向左或者向右滑動滑塊兒有相反的效果。
建議花一點時間上手操做下這些空間,並理解各自的用處。
視圖層排序
再次編譯和運行應用程序,並點擊用戶界面底部的"More"標籤。第一眼看去界面看起來還OK,可是它沒有按照開發者的定義準確執行,圖片上的模糊效果沒有展現出來。咱們能夠經過調試視圖層次來更好地肯定問題所在。
向左或者向右拖拽視圖來查看具體狀況,接着將view spacing slider向右拖動。
這樣一來,不一樣視圖間的間距變大了,層次也更加清晰,咱們看到在圖片"下方"還隱藏着另外一個視圖,選中隱藏的視圖,它就是"丟失"的視覺效果視圖。
打開Main.storyboard 並選中Second View Controller Scene。在左側的文檔概覽面板中,展開Second View Controller的視圖對象以查看子視圖的排序。
Xcode在文檔概覽中按照遞升順序堆疊視圖,換句話說,列表頂層的視圖是視圖層次的基礎。
修復問題很簡單。運行時,Blur Effect View隱藏在Sky Image之下,由於它是視圖層次的第一個視圖。在文檔概覽中點擊並拖拽 Blur Effect View,結果會以下圖展現同樣:
再次運行應用程序就能看到模糊效果了。應用程序的用戶界面看起來符合設計的初衷。咱們還能夠查看iOS模擬器的其餘調試功能,看看還完善了其餘什麼地方或功能。
5.iOS模擬器調試功能
編譯並運行應用程序,選中模擬器,從 Debug菜單中選擇Color Blended Layers選項。
而後會看到app的用戶界面被紅色和綠色覆蓋,顯示了哪些圖層能夠被疊加覆蓋,以及哪些圖層是透明的。混合層屬於計算密集型視圖,因此推薦儘量地使用不透明的圖層。
蘋果在其文檔(iOS Simulator User Guide)中對此進行了註明,並在表視圖處理上使用了不透明圖層。滾動視圖時會有些表現不大好的地方,一個重要的緣由就是使用了混合圖層,而若是內容背景是不透明層,那麼頁面滾動效果就會很是流暢和平穩。
對於這款應用程序來講,假使用戶有數百個項目要展現,可能會出現滾動性能不一致的狀況。表視圖單元格當前使用的是混合層。因爲視圖控制器的視圖背景是白色,因此無論表視圖單元格使用的是混合層或者不透明層,終端用戶不會覺察到有什麼不同。
打開Main.storyboard並選中To Do list Scene中的表視圖單元格屬性。在屬性檢查器(Attributes Inspector)中,向下滾動Drawing分區並勾選Opaque。
在啓用Color Blended Layers的狀態下編譯並運行應用程序。因爲表視圖單元格如今使用了不透明層,因此會用綠色覆蓋,以指示它們是不透明的。
除了標記圖層外,還有其餘一些有用的功能可幫開發者在iOS模擬器中調試應用。如下是其中一些比較有用的:
Toggle Slow Animations in Frontmost App: 選中模擬器,打開Debug菜單選中Toggle Slow Animations in Frontmost App,該功能能夠下降app中動畫的運行速度,適合調試包含複雜動畫的應用程序。也但是使用快捷鍵Command-T來操做。
Color Copied Images:該選項能夠給繪製時被Core Animation複製的圖片添加藍綠色疊加層。
Color Misaligned Images:若是圖片邊界沒有與目標像素完美對齊,該功能可爲圖片疊加上一層品紅色。若是圖片使用肯定的比例大小繪製,那麼該功能會爲圖片添加一層黃色疊加。
Color Off Screen Rendered:.該選項爲離屏渲染內容添加一個黃色的疊加層。
不少開發者會忽略接入電話時應用狀態欄的設計問題,你能夠經過觸發通話中狀態欄來簡單測試。在iOS模擬器中,從Hardware菜單中選中Toggle In-Call Status Bar。
想查看app如何響應事件,可按下Command-T來啓用slow animations,並按下Command-Y來展現電話接入時的狀態欄。假若你的應用程序使用了導航欄,那麼操做系統會爲你兼顧到這一起。
除了給視圖着色外,還要記住iOS模擬器也能夠調試Core Location問題。你能夠在特定經緯度模擬設備,
若是你的應用程序使用iCloud來管理數據,你也能夠手動觸發同步事件。
本文中使用的demo app很是簡單,使用文中提到的技術能夠幫你在將來節省很多時間。視圖調試能夠幫你修正不少用戶界面中出現的問題。
除了Xcode和InterfaceBuilder以外,使用iOS模擬器的調試功能能夠提高應用性能和識別開發過程當中的瓶頸。蘋果的人機交互指南(中文版 英文版)強調了積極響應對app的重要性,能讓用戶以爲應用易於使用和操做。蘋果對InterfaceBuilder的提高讓視圖調試變得史無前例的簡單。