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]
{(
<AssistantView: 0x7f9a4cd8fa80>
)}
(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:]'