iOS 快速定位UI源码

1. 寻找Button的action selector

第一步需要定位到Button的对象的地址。以前一般是用 [[UIApp keyWindow] recursiveDescription] 来找到对象,比较考眼力。或者用图形化商业软件Reveal,现在Xcode 8自带了这个功能。



右边可以看到Button的Address(下面可以看到Target和Action,但是Action应该是有问题的)。接下来用lldb来找到action

(lldb) po [0x7f9a4cda44b0 allControlEvents]
0x0000000000000040

(lldb) po [0x7f9a4cda44b0 allTargets]
{(
    
)}

(lldb) po [0x7f9a4cda44b0 actionsForTarget:0x7f9a4cd8fa80 forControlEvent:0x40]
<__NSArrayM 0x7f9a4ccabc00>(
onGotoCreateAccountClick:
)

2. 找到当前的ViewController

  • 方法1:通过rootViewController
    这个方法以前提到过,《一张图看懂如何找出当前显示的ViewController》
po [[UIApp rootViewController] _printHierarchy]

如果有安装chisel就更简单了,直接pvc

  • 方法2:通过Responder chain
    一般响应链的流程是:view -> super view -> view controller -> (view controller's view's super view) -> window -> application -> nil



    随便找一个子view,递归的调用nextResponder,最终是能够找到VC。

  • 方法3:push/pop前断点
    大部分ViewController都是通过push方法进入的,在这里设一个断点,通常在caller附近能看到被push的controller的一下信息;查看寄存器参数也能找到。

breakpoint set -b '-[UINavigationController pushViewController:animated:]'

你可能感兴趣的:(iOS 快速定位UI源码)