1. 程式人生 > >如何研究別人龐大的 Swift 程式 ? 印出 call stack

如何研究別人龐大的 Swift 程式 ? 印出 call stack

如何研究別人龐大的 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 呼叫的先後順序。