如何在self.view属性上设置lldb观察点?
我想跟踪什么时候改变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观察点的问题,但是找不到这个具体的案例。
谢谢你的帮助。
视图控制器从其_view
实例variables引用其视图。
该视图不直接存储其框架。 它只是返回它的图层的“框架”。
该视图从其_layer
实例variables引用其图层。
该层也不存储该帧。 它从bounds
, position
, anchorPoint
和transform
计算它的框架。 大小是bounds
一部分。
图层不会将其边界直接存储在实例variables中。 相反,它的layer
实例variables引用了一个私有的C ++类CA::Layer
一个实例。 这个类的成员布局是没有logging的。
换句话说,你可以去self->_view->_layer->layer
到达CA::Layer
实例,但是你被卡住,因为你不知道在CA::Layer
哪里find边界。
所以,试图用观察点来检测视图大小的变化是相当困难的。
在-[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 )>
在64位模拟器上,break命令应该是:
break set -F '-[CALayer setBounds:]' -c '$rdi == 0x...'