iOS Private API performSelector崩溃

时间:2013-08-17 05:18:42

标签: ios iphone-privateapi uiresponder

基本上我想获得一个UIButton的动作目标列表。我经历了this,我的问题略有不同,因为我不知道目标是什么。我所拥有的只是一个UIButton对象。所以这就是我为捕获所有行动目标所做的工作。

受以下方法的启发,我将firstResponder对象作为有效指针。

UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
UIView   *firstResponder = [keyWindow performSelector:@selector(firstResponder)];

我在UIKit上使用class-dump来查看UIWindow类,我发现firstResponder如下所示。

 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIWindow : UIView {
  @package
    UIResponder             *_firstResponder;
}

然后我通过类转储检查了UIControl

NS_CLASS_AVAILABLE_IOS(2_0) @interface UIControl : UIView {
  @package
     NSMutableArray* _targetActions;
 }

所以这就是我尝试做的事情,它会崩溃。

    NSMutableArray *arr = (NSMutableArray*)[((UIControl*)btn) performSelector:@selector(targetActions)];
    NSLog(@"%@",arr);

听起来像是对我的阴谋。但更有可能的是我搞砸了一些事情。有没有人知道如何访问UIControl的targetActions数组?

编辑:这是错误信息 -

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-    [UIRoundedRectButton targetActions]: unrecognized selector sent to instance 0x1c0ab0'

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:2)

根据the UIControl documentation,要发送以获取目标列表的消息是 allTargets ,而不是您建议的targetActions。解决方案的其余部分在How to get UIButton Target, Action and Control events?

的接受答案中

当您不知道自己在做什么时可以使用的调试技术是使用respondsToSelector来检查您是否正在发送对象可以响应的消息: when to use respondsToSelector in objective-c