以下代码抛出异常。
vcClass
是Class
对象(来自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");
}
答案 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)