Можно ли установить точки наблюдения на свойства Swift?

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

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

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

Есть ли у меня другие возможности?

Ответ 1

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

Если, как и я, вы хотите разбить только тогда, когда свойство изменено и игнорировать выборки, установите точку останова в объявлении свойства, затем перейдите в консоль 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.

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

Ответ 2

В 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'