Подтвердить что ты не робот

Как установить контрольную точку lldb на свойство self.view?

Я хочу отслеживать, когда что-то меняет размер self.view. Какой правильный формат?

(lldb) po self.view
(UIView *) $1 = 0x0a8aba20 <UIView: 0xa8aba20; frame = (0 0; 480 864); autoresize = W+TM+BM; layer = <CALayer: 0xa8aba50>>
(lldb) watch set variable self.view.frame.size.width
error: "self" is a pointer and . was used to attempt to access "view". Did you mean "self->view.frame.size.width"?
(lldb) watch set variable self->view
error: "view" is not a member of "(PlayViewController *) self"
(lldb) watch set variable self->view.frame.size.width
error: "view" is not a member of "(PlayViewController *) self"

Я пробовал документацию и другие вопросы о секундомерах lldb, но не могу найти ничего для этого конкретного случая.

Спасибо за вашу помощь.

4b9b3361

Ответ 1

Контроллер представления ссылается на его представление из его переменной _view.

Вид не сохраняет свой фрейм напрямую. Он просто возвращает свой слой `frame '.

Вид ссылается на его слой из его переменной _layer.

Слой также не сохраняет фрейм. Он вычисляет свой кадр из bounds, position, anchorPoint и transform. Размер является частью bounds.

Слой не сохраняет свои границы непосредственно в переменной экземпляра. Вместо этого переменная экземпляра layer ссылается на экземпляр частного класса С++, CA::Layer. Макет элемента этого класса недокументирован.

Другими словами, вы можете пойти self->_view->_layer->layer, чтобы перейти к экземпляру CA::Layer, но тогда вы застряли, потому что не знаете, где в CA::Layer найти границы.

Итак, попытка использовать контрольную точку для обнаружения изменений размера представления довольно затруднительна.

Легче поставить точку останова на -[CALayer setBounds:].

На симуляторе

Не забудьте использовать адрес слоя в состоянии точки останова, не адрес представления.

(lldb) po self.view
(UIView *) $1 = 0x0a034690 <UIView: 0xa034690; frame = (0 20; 768 1004); autoresize = W+H; layer = <CALayer: 0xa034780>>
(lldb) break set -F '-[CALayer setBounds:]' -c '((int*)$esp)[1] == 0xa034780'
Breakpoint created: 2: name = '-[CALayer setBounds:]', locations = 1, resolved = 1

Когда точка останова ударяется, экземпляр CALayer ссылается на ((int *)$esp)[1], а новые границы - *(CGRect *)($esp+12):

(lldb) po ((int*)$esp)[1]
(int) $8 = 167987072 <CALayer:0xa034780; position = CGPoint (384 480); bounds = CGRect (0 0; 768 1004); delegate = <UIView: 0xa034690; frame = (0 -22; 768 1004); autoresize = W+H; layer = <CALayer: 0xa034780>>; sublayers = (<CALayer: 0xa033010>); backgroundColor = <CGColor 0xa034960> [<CGColorSpace 0xa02b3b0> (kCGColorSpaceDeviceRGB)] ( 1 1 1 1 )>
(lldb) p *(CGRect*)($esp+12)
(CGRect) $9 = origin=(x=0, y=0) size=(width=768, height=960)
(lldb) finish
(lldb) po 0xa034780
(int) $10 = 167987072 <CALayer:0xa034780; position = CGPoint (384 480); bounds = CGRect (0 0; 768 960); delegate = <UIView: 0xa034690; frame = (0 0; 768 960); autoresize = W+H; layer = <CALayer: 0xa034780>>; sublayers = (<CALayer: 0xa033010>); backgroundColor = <CGColor 0xa034960> [<CGColorSpace 0xa02b3b0> (kCGColorSpaceDeviceRGB)] ( 1 1 1 1 )>

На устройстве

Не забудьте использовать адрес слоя в состоянии точки останова, не адрес представления.

(lldb) po self.view
(UIView *) $0 = 0x1f031a10 <UIView: 0x1f031a10; frame = (0 20; 768 1004); autoresize = W+H; layer = <CALayer: 0x1f031b00>>
(lldb) break set -F '-[CALayer setBounds:]' -c '$r0 == 0x1f031b00'
Breakpoint created: 2: name = '-[CALayer setBounds:]', locations = 1, resolved = 1

Когда точка останова ударяется, экземпляр CALayer ссылается на $r0, новое начало X находится в $r2, новое начало Y находится в $r3, а новый размер - *(CGSize *)$sp:

(lldb) po $r0
(unsigned int) $7 = 520297216 <CALayer:0x1f031b00; position = CGPoint (384 480); bounds = CGRect (0 0; 768 1004); delegate = <UIView: 0x1f031a10; frame = (0 -22; 768 1004); autoresize = W+H; layer = <CALayer: 0x1f031b00>>; sublayers = (<CALayer: 0x1f030840>); backgroundColor = <CGColor 0x1f031ce0> [<CGColorSpace 0x1e530ad0> (kCGColorSpaceDeviceRGB)] ( 1 1 1 1 )>
(lldb) p/f $r2
(unsigned int) $14 = 0
(lldb) p/f $r3
(unsigned int) $15 = 0
(lldb) p *(CGSize *)$sp
(CGSize) $16 = (width=768, height=960)
(lldb) finish
(lldb) po 0x1f031b00
(int) $17 = 520297216 <CALayer:0x1f031b00; position = CGPoint (384 480); bounds = CGRect (0 0; 768 960); delegate = <UIView: 0x1f031a10; frame = (0 0; 768 960); autoresize = W+H; layer = <CALayer: 0x1f031b00>>; sublayers = (<CALayer: 0x1f030840>); backgroundColor = <CGColor 0x1f031ce0> [<CGColorSpace 0x1e530ad0> (kCGColorSpaceDeviceRGB)] ( 1 1 1 1 )>

Ответ 2

В 64-битных симуляторах команда break должна быть:

break set -F '-[CALayer setBounds:]' -c '$rdi == 0x...'