歡迎關注咱們的公衆號,咱們每週都會有原創文章分享。咱們主要定位在移動開發領域,分享移動開發技術,包括 iOS、Android、小程序、移動前端、React Native、weex 等。前端
知識小集 GitHubgit
「我靠,這個問題怎麼查,嘗試了幾十遍了,都不能復現?」,「我去,這個問題讓我匪夷所思啊」……常常聽到這類的聲音,因此今天打算給你們簡單介紹幾款 Xcode
自帶的超好用的診斷工具,來提升你們的工做效率。(本文不會介紹詳細的使用方法,請自行谷歌或者百度。)github
Xcode
已經爲咱們準備了十分豐富的編譯警告,儘管這些警告不會致使編譯不過,可是背後必定沒有平白無故的恨。請正確對待全部警告,避免在運行時產生一些讓你感到難以捉摸的現象,Treat Warnings as Errors
也不失爲一個不錯的選擇。若是你對某些警告有絕對的自信,能夠經過修改 Build Settings
裏的 Warnings
選項,或者在提示警告的代碼處添加 diagnostic ignore
來消除它們。隨着 Xcode
的不斷更新,你還應該經過工程文件的 Editor-Validate Settings
來將工程配置選項改成最優。小程序
很早之前 Xcode
就已經爲咱們提供了靜態檢測工具,用它能夠檢測一系列難以發現的問題,例如內存泄露、邏輯錯誤、未使用的變量和未包含的庫等。對於不少項目而言,完整的跑一次 Analyze
會花費較長的時間,也許是由於這一點,這項工具被愈來愈多的開發者忽視掉。你能夠經過修改 Build Settings
裏的 Analyze During 'Build'
在平時開發調試的過程當中即時地進行Analyze。weex
除了編譯警告和 Analyze
,蘋果還爲咱們提供了更多的動態調試工具。它們分散在 Xcode
的各個角落,與咱們平常開發息息相關,潤物細無聲。網絡
當 App
開始調試以後,Xcode
左側的 navigator
視圖會自動切換到 debug navigator
。在這裏,默認狀況下會展現幾項關鍵指標來爲你概述當前 App
的運行狀態。經過它們你能夠大體瞭解每一個線程的運行、內存申請、電量使用、磁盤讀寫、網絡操做等情況。若是你關心更詳細的診斷信息,你能夠很方便地進入 Instruments
進行相應的診斷。多線程
###Process Debug工具
Xcode
爲咱們提供了四種進程調試:單元測試
View Process by Thread
:線程的調用棧,這個是默認的,也是咱們最經常使用的。加個斷點,查看當前的全部線程調用狀況。測試
View Process by Queue
:和 View Process by Thread
差很少,當前隊列名稱會替代 Thread
命名,同時顏色也要豐富一些。
View UI Hierarchy
:能夠切換到上帝視角來查看視圖層級和各視圖屬性。
View Memory Graph Hierarchy
:能夠方便的檢測循環引用等內存泄露問題,很是實用。
除了 Xcode
在早期爲咱們提供的 Guard Malloc
、Zombie Objects
等,在最近兩個版本中前後引入的 Sanitizers
和 Main Thread Checker
進一步完善了開發過程當中的檢測工具。
對於 MRC
環境下的 OC
來說,在一個對象被釋放以後再去對它進行操做會觸發 crash
;進入 ARC
時代以後,咱們愈來愈少地去關心這個問題。但當你使用 Core Foundation
,或者混編 C\C++
的時候,這個問題會表現得不可預料。當一片內存區域被釋放以後,在該區域被從新分配以前去訪問它不會出現問題,這就帶來了很大的隨機性。除此以外,若是你在使用指針訪問內存的時候不當心越了界,帶來的後果也是不可預料的。對於這些問題,Xcode
提供了 Address Sanitizer
來更有力地進行檢測。
以往,Data Race
的問題是十分難定位和排查的,由於它帶來的問題每每是不可預期的。Xcode
經過記錄每次內存訪問的時間等信息,在每次訪問內存的時候進行檢測。在平常開發調試過程當中你能夠選擇性地開啓這項工具,可是在單元測試中,應當考慮開啓它,若你的用例覆蓋度較高,它可能能夠爲你發現絕大部分多線程數據競爭的問題。
未定義行文檢測,好比說除以 0,加載內存對其指針、非關聯一個空指針等。有可能引起 crash
也可能不 crash
,具體狀況和編譯器有關係,可是咱們應該避免這種事情的發生。
檢測在子線程使用 AppKit
,UIKit
和其餘 API
,這個檢測工具是默認開啓的,開啓後不須要從新編譯。原理是經過App啓動後,自動替換隻能在主線程使用的API,當調用此類API時剖出異常。
值得一提的是,因爲 Address Sanitizer
、 Guard Malloc
或 Zombie Objects
的實現原理直接或間接地影響了運行時對象的內存管理,若開啓了這些診斷工具,Debug Gauges
中的 Memory
一項會失效。
儘早的解決警告和診斷 App
會大大提高上線後 App
的穩定性,同時也能夠提升咱們的工做效率,那還等什麼呢,快點行動起來吧。