代碼
import UIKit
class ViewController: UIViewController {
//@IBAction func buttonTapped(_ sender: UIButton)
@IBAction func buttonTapped(_ sender: UIButton){
//print("Called buttonTapped(_: )")
print("Method: \(#function) in file: \(#file) line: \(#line) called")
//print("sender: \(sender)")
//print("Is control on? \(sender.isOn)")
badMethod()
}
func badMethod() {
let array = NSMutableArray()
for i in 0..<10{
array.insert(i, at: i)
}
for _ in 0...10{
array.removeObject(at: 0)
}
print(array)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
單步調(diào)試代碼
設(shè)置斷點:假設(shè)目前還不知道導致崩潰的原因窟她,只知道應用是在點擊按鈕之后崩潰的码泞。通常的做法是逛薇,當點擊按鈕之后讓應用暫停刹泄,然后一步一步地運行來查找原因外里。
當應用運行到斷點的位置時會暫停執(zhí)行 , Xcode 會自動跳轉(zhuǎn)到下一行將要執(zhí)行的代碼的位置 特石,并且這行代碼會綠色高亮顯示盅蝗。同時, Xcode 還打開了一些新的顯示區(qū)域姆蘸。
點擊
單步執(zhí)行
按鈕將高亮條移動到 badMethod() 所在的行 (此時 badMethod () 不會被執(zhí)行)墩莫。 這里并沒有進入 print() 方法,因為它是蘋果框架中的方法乞旦,所以不會有什么問題贼穆。當 badMethod() 高亮顯示之后,點擊
單步進入
按鈕進入 bad Method() 方法中兰粉,繼續(xù)點擊單步進入
按鈕執(zhí)行代碼故痊,直到應用崩潰 。這里需要點很多下玖姑,而且看起來是在同一行代碼上一直執(zhí)行一 事實就是如此愕秫,因為這里有一個循環(huán)。
- 單步執(zhí)行的過程中焰络,可以把鼠標懸浮在 i 或者 array 上戴甩,Xcode 會在彈出框中顯示變量的值。
- 有時候希望知道執(zhí)行了某行代碼闪彼,但是并不需要知道任何其他信息甜孤,也不需要應用暫停 。要完成這個任務(wù) 畏腕,可以為斷點增加一個聲音并且在觸發(fā)斷點后繼續(xù)執(zhí)行 缴川。
現(xiàn)在執(zhí)行到斷點時就不會暫停了,而是播放一個聲音描馅。編譯并運行應用把夸,然后點擊按鈕, 這次會 聽到一串聲音 铭污,接著應用就崩潰了 恋日。
- 為了確認循環(huán)執(zhí)行完了,再次找到斷點嘹狞,選擇 Edit Breakpoint岂膳。 在彈窗中點擊 Action 右邊的+可以增加 一個新動作 。在列表中選擇 Log Message (日志消息)磅网,然后在文本區(qū)域輸入 Pass number %H (%H 表示斷點的觸發(fā)次數(shù))谈截,最后選中 Log message to console (在控制臺中顯示日志消息)旁邊的單選框。
現(xiàn)在查看一下控制臺 ,可以看出斷點觸發(fā)了 10 次 傻盟, 這說明代碼的循環(huán)確實執(zhí)行完了。
異常斷點(exception breakpoint)
- 這個方法通常是用來發(fā)現(xiàn)新問題的嫂丙,在實際開發(fā)中娘赴,通常不知道問題出在哪行代碼中。使用異常斷點能直接知道哪行代碼導致了崩潰跟啤。
編譯并運行應用诽表,然后點擊按鈕 。這次應用自動停止了隅肥,并且 Xcode 直接顯示 了導致異常的位置竿奏,但是目前控制臺中還沒有目志 , 因為現(xiàn)在應用還沒有崩潰 腥放。 如果要查看崩潰的原因 泛啸,則可以重復點擊調(diào)試欄上的繼續(xù)執(zhí)行
按鈕 ,直到崩潰出現(xiàn) 秃症。
特征斷點(symbolic breakpoint)
特征斷點并不是按照行號來設(shè)置的候址,而是按照方法名來設(shè)置的。
在真實開發(fā)過程中 种柑,很少會用到特征斷點岗仑,通常只會用到前面介紹的幾種斷點。 特征斷點適用于調(diào)試不是自己寫的代碼 聚请, 例如調(diào)試 Apple 框架中的代碼荠雕,查看應用中 UIViewController 的 loadView() 方法是否被調(diào)用 。
編譯并運行應用 驶赏,點擊按鈕之后炸卑,應用就會在 badMethod() 的位置暫停了 。