Section 12/161 menit

12. Debugging SwiftUI

12. Debugging SwiftUI

Inspeksi View Hierarchy

swift
# Di Xcode: Debug → View Debugging → Capture View Hierarchy (visual)

# Atau dari LLDB — print view hierarchy teks
(lldb) po UIApplication.shared.connectedScenes
       .compactMap { $0 as? UIWindowScene }
       .flatMap { $0.windows }
       .first?.rootViewController?.view
       .perform(Selector(("recursiveDescription")))?
       .takeUnretainedValue()

Breakpoint di Body Re-render

swift
# Berhenti setiap kali ContentView.body dievaluasi
(lldb) breakpoint set --func-regex "ContentView.*body"

# Lihat berapa kali view di-render (action count)
(lldb) breakpoint list
# Perhatikan "times hit = N" — jika N terlalu tinggi, ada re-render berlebihan

Debugging @State dan @Observable

swift
# Set nilai @State langsung (dengan auto-continue untuk lihat efeknya)
(lldb) expr myView.isLoading = true
(lldb) continue

# Untuk @Observable model yang di-inject via environment:
(lldb) po myObservableModel
# Semua properti terlihat karena @Observable menggunakan stored properties biasa

Debugging Preview

SwiftUI Preview menjalankan kode di proses terpisah — breakpoint di Xcode tidak aktif di preview. Untuk debug preview:

swift
# Attach LLDB ke proses XCPreviewAgent
# Terminal:
xcrun lldb
(lldb) process attach --name XCPreviewAgent

# Atau di Xcode: Debug → Attach to Process → pilih XCPreviewAgent