2016-02-29 99 views
0

我有這種情況下,我有一個靜態變量,它改變了它的價值在整個應用程序導致一個錯誤的價值。沒有深入代碼的細節。我需要知道是否有辦法看這個變量。因爲在Xcode上每次嘗試觀察一個變量,它都會給我這個錯誤「錯誤:在此幀中找不到名爲'backend'的變量」。如何知道什麼改變了變量值在xcode swift

所以我的問題是,是否有任何解決方法來知道哪個地方確實改變了這個變量的值。

除了使用手錶以外的任何東西,因爲由於某些原因,由於它不適用於我的上述錯誤。

+0

@DanBeaulieu是的,我使用斷點,但在應用程序中有定時器,我已經在計時器內打印了此變量的值,並且由於某種原因,某些點的變量值隨機變化。所以我需要知道它爲什麼被改變 –

+0

我想象一下手錶只會告訴你你已經知道的東西:價值被改變了,但不是原因。嘗試找到變量設置的所有位置,並添加斷點或記錄。 – deltab

回答

6

可以將屬性觀察者添加到變量(didSetwillSet),要麼設置一個斷點,並在斷點被擊中時查看框架,或者您可以記錄當前線程的當前堆棧跟蹤。


第一個例子,在屬性觀察一個簡單的斷點,我已經設置了以下非常簡單的類:

class Observable { 
    static var someProperty: String? { 
     willSet { 
      print("Some property will be set.") 
     } 
     didSet { 
      print("Some property has been set.") 
     } 
    } 
} 

斷點:

enter image description here

我只是在單元測試中運行這個代碼,但是你會在任何地方得到相同的結果。這是我引發的變化與代碼:

class ObservableTests: XCTestCase { 
    func testObservable() { 
     Observable.someProperty = "foo" 
     Observable.someProperty = "bar" 
     Observable.someProperty = "baz" 
    } 
} 

當代碼運行時,我們會停止在這裏的斷點:

enter image description here

我陷害這張截圖特別是像這樣。我們看到綠線和藍色箭頭突出顯示我們正在停止的斷點,但在左側看。我們可以看到其中我們正在使用的線程以及我們如何達到這個特定點。重要的是,我們可以在堆棧中上下點擊。

在這裏,堆棧中的大部分框架只是向我們展示大部分無益的彙編代碼。這就是我們看到的,如果我們查找一個框架:

enter image description here

但是,如果我們多一個框架,我們得到的是修改我們的變量代碼:

enter image description here

要明確地說,我點擊跳轉到代碼的不同部分,導致這個變量被設置在這裏:

enter image description here


如前所述,打印堆棧跟蹤也是一種選擇,雖然它的效率顯着降低。

如果我們改變我們的willSetdidSet看起來更像是這樣的:

class Observable { 
    static var someProperty: String? { 
     willSet { 
      for symbol: String in NSThread.callStackSymbols() { 
       print(symbol) 
      } 
     } 
     didSet { 
      for symbol: String in NSThread.callStackSymbols() { 
       print(symbol) 
      } 
     } 
    } 
} 

那麼我們將能夠看到在日誌中打印完整的堆棧跟蹤,如下所示:

enter image description here

從上面的屏幕截圖中感興趣的線是這兩個:

2 TTDSamplesTests      0x00000001087603fa _TFC15TTDSamplesTests15ObservableTests14testObservablefS0_FT_T_ + 74 
3 TTDSamplesTests      0x0000000108760492 _TToFC15TTDSamplesTests15ObservableTests14testObservablefS0_FT_T_ + 34 

這很難破譯,但你可以選擇它的部分。

_TFC15TTDSamplesTests15ObservableTests14testObservablefS0_FT_T_

  • 目標的我在跑這個代碼名稱爲TTDSamplesTests
  • 該方法的的名稱被稱爲ObservableTests
  • 方法的名稱稱爲setter的名稱爲testObservable
0

一兩件事你可以做的是與計算性能取代你的變量和setter方法設置斷點:

class Foo { 
    static var bar:Int = 0 
} 

class FooToo { 
    static var _bar:Int = 0 

    static var bar:Int { 
    set { 
     // put break point here 
     print("FooToo bar is set") 
     FooToo._bar = bar 
    } 
    get { 
     return FooToo._bar 
    } 
    } 
} 

Foo.bar = 10 
FooToo.bar = 10 // -> prints "FooToo bar is set" 
+0

當一名物業觀察員完成這項工作時,這是很多工作。 – nhgrif

+0

您也可以使用財產觀察員來做這件事,是的。這兩種方式都沒有太多的工作。 – ColGraff

相關問題