2015-01-23 2 views
10

В Objective-C я иногда устанавливал точки наблюдения в LLDB, чтобы сообщить, когда переменные экземпляра были изменены. Могу ли я сделать это с помощью свойств Swift?Можно ли установить точки наблюдения на свойства Swift?

Прямо сейчас, единственный способ, которым я могу достичь этого:

  • добавление обработчика didSet к свойству и установив точку останова внутри (но это требует остановки программы и пересборки, какой вид поражения цели)
  • добавления символической точки останова на [setPropertyName:], но это работает только, если класс происходит поддерживать Objective-C мостовую

есть ли у меня какие-либо другие варианты?

ответ

14

Ответ был намного проще, чем я себе представлял. Самый простой способ сделать это - просто добавить точку останова в объявлении свойства. Отладчик будет прерываться всякий раз, когда свойство будет либо прочитано, либо записано.

Если, как и я, вы хотите разбить только при изменении свойства и игнорировании извлечений, установите точку останова в объявлении свойства, затем перейдите в консоль LLDB и введите «br list», чтобы просмотреть список всех ваших контрольные точки:

(lldb) br list 
Current breakpoints: 
1: file = '/Users/testuser/Desktop/TestFoo/Test.swift', line = 12, locations = 3, resolved = 3, hit count = 1 

    1.1: where = TestFoo`TestFoo.Test.x.getter : Swift.Int + 12 at Test.swift:12, address = 0x00000001084cfefc, resolved, hit count = 1 
    1.2: where = TestFoo`TestFoo.Test.x.setter : Swift.Int + 16 at Test.swift:12, address = 0x00000001084cff80, resolved, hit count = 0 
    1.3: where = TestFoo`TestFoo.Test.x.materializeForSet : Swift.Int + 16 at Test.swift:12, address = 0x00000001084d00f0, resolved, hit count = 0 

Как вы можете видеть, что есть хозяин точки останова «1» с тремя суб-контрольными точками. Отключите контрольную точку для геттера:

(lldb) br disable 1.1 
1 breakpoints disabled. 

и все вы настроены. Отладчик будет ломаться только тогда, когда это свойство будет изменено.

1

На XCode (8.2 Swift 3.0) установите точку останова, как правило, на свойство swift, затем запустите приложение. После того, как приложение побежал идти к точке останова панели можно расширить точку останова на несколько точек останова:

enter image description here

Все выбраны по умолчанию, вы можете отключить те, которые вам не нужны. ПРИМЕЧАНИЕ. Я обнаружил, что при первом добавлении точки останова он не будет расширяться до тех пор, пока вы не запустите приложение.

Альтернативный метод, который вы можете попробовать, это использовать lldb для их добавления. Сначала добавьте точку останова где-то внутри вашего экземпляра класса, например viewDidLoad ext. p self и обратите внимание на адрес памяти вашего экземпляра.

Затем добавьте точку останова, например, где 0x0f0f0f0f0f0f - адрес памяти вашего класса.

break set -F '-[MyClass setMyProperty:]' -c '$rdi == 0x0f0f0f0f0f0f’ 
Смежные вопросы