如何研究別人龐大的 Swift 程式 ? 印出 call stack
阿新 • • 發佈:2018-12-09
如何研究別人龐大的 Swift 程式 ? 印出 call stack
研究別人寫的程式,是身為一個工程師時常遇到的事。然而這些別人寫的程式,經過時間的洗禮,往往變得既龐大又難以追蹤,就連親切的 Swift 程式也不例外。
除了請原作者出來喝咖啡,請他回憶三年前寫的程式外,有沒有好方法能幫我們快速瞭解程式流程呢 ?
其實是有的,請先找到確定會呼叫的關鍵 function,然後在裡面印出 call stack,也就是 function 呼叫的順序,即可幫我們瞭解程式流程。比方以下 ViewController 的程式,我們在 function test2 裡利用 Thread.callStackSymbols 印出 call stack :
class ViewController: UIViewController {
func test2() {
print(Thread.callStackSymbols)
}
func test1() {
test2()
}
override func viewDidLoad() {
super.viewDidLoad()
test1()
}
}
property callStackSymbols 的型別為 [String],結果如下:
雖然印出 call stack 很簡單,不過它不太好看,並不適合正常人閱讀。建議利用迴圈將 array 裡的字串依序印出
func test2() {
for symbol in Thread.callStackSymbols {
print(symbol)
}
}
結果如下
0 Demo 0x00000001004c7a1c $S4Demo14ViewControllerC5test2yyF + 60
1 Demo 0x00000001004c7e1b $S4Demo14ViewControllerC5test1yyF + 43
2 Demo 0x00000001004c7ea5 $S4Demo14ViewControllerC11viewDidLoadyyF + 117
3 Demo 0x00000001004c7f24 $S4Demo14ViewControllerC11viewDidLoadyyFTo + 36
4 UIKitCore 0x0000000105386d63 -[UIViewController loadViewIfRequired] + 1186
5 UIKitCore 0x00000001053871c2 -[UIViewController view] + 27
6 UIKitCore 0x000000010546751b -[UIWindow addRootViewControllerViewIfPossible] + 122
7 UIKitCore 0x0000000105467c36 -[UIWindow _setHidden:forced:] + 294
8 UIKit 0x000000011e354987 -[UIWindowAccessibility _orderFrontWithoutMakingKey] + 86
9 UIKitCore 0x000000010547ad9f -[UIWindow makeKeyAndVisible] + 42
10 UIKitCore 0x0000000104c5d4c8 -[UIApplication _callIniti
現在清楚多了。call stack 的順序要倒著看,所以第一行告訴我們, ViewController 的 test2 是最後執行的 function,前一個是 test1, 前前一個是 viewDidLoad,其它以此類推。只要利用此技巧,即可快速瞭解 App 執行時, function 呼叫的先後順序。