NSInvocation意外异常

时间:2013-05-10 12:29:03

标签: iphone ios objective-c exception nsinvocation

以下代码抛出异常。

vcClassClass对象(来自UIViewController的继承者)。 Self包含viewWillAppear:

我的实施
SEL viewWillAppearSEL = @selector(viewWillAppear:);
IMP viewWillAppearWithSuperIMP = [self methodForSelector:viewWillAppearSEL];
class_addMethod(vcClass, viewWillAppearSEL, viewWillAppearWithSuperIMP, @encode(BOOL));
NSMethodSignature *methodSignature = [vcClass instanceMethodSignatureForSelector:viewWillAppearSEL];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
[invocation setSelector:viewWillAppearSEL];

留言:

由于未捕获的异常终止应用' NSInvalidArgumentException',原因:' - [NSInvocation setArgument:atIndex:]:index(1)超出范围[-1, -1]

其他信息:iOS5,ARC。 有人能解释我的错误吗?

更新:

此代码代码为我提供了响应消息。所以我的班级对象是正确的     [vcClass instancesRespondToSelector:viewWillAppearSEL]? NSLog(@"响应"):NSLog(@"没有响应");

我在[invocation setSelector:viewWillAppearSEL];之后立即崩溃。这就是我将主题标题称为 NSInvocation 的意外异常的原因。

UPDATED2:

同样 viewWillAppear: 的实施

- (void)viewWillAppear:(BOOL)animated {
    Class parentViewController = [self superclass];
    void (*superViewWillAppear)(id, SEL, BOOL) =(void(*)(id, SEL, BOOL))class_getMethodImplementation(parentViewController, _cmd);
    superViewWillAppear(self, _cmd, animated);
    NSLog(@"view will appear with super");
}

2 个答案:

答案 0 :(得分:1)

BOOL * arg1;

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
[invocation setSelector:viewWillAppearSEL];
[invocation setArgument:&arg1 atIndex:2];   // argument indexing is offset by 2 hidden args

答案 1 :(得分:1)

您的代码存在的一个问题是您要传递给class_addMethod()的类型编码。此类型编码必须包括:1)返回类型,2)self_cmd的类型(前两个隐藏参数),然后3)所有其他参数的类型。

对于像- (void)viewWillAppear:(BOOL)animated这样的方法,类型编码应该是字符串

v@:c

  • v - 对于void,返回类型
  • @ - 对于id,请输入self
  • : - 对于SEL,请输入_cmd
  • c - 对于char,这就是BOOL。这是您@encode(BOOL)
  • 时获得的结果