Следующий код генерирует исключение.Неожиданное исключение с NSInvocation
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]: индекс (1) за пределами [-1, -1]
Дополнительная информация: iOS5, ARC. Может кто-нибудь объяснить мне, что случилось?
ОБНОВЛЕНО:
Этот код код дает мне отвечает сообщение. Итак, мой объект класса правильный [vcClass экземплярыRespondToSelector: viewWillAppearSEL]? NSLog (@ «отвечает»): NSLog (@ «не отвечает»);
Alse Im получение аварии сразу после [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");
}
Это означает, что у вас есть неправильный класс в 'vcClass', и он не реализовал этот селектор. –
'[vcClass instanceRespondToSelector: viewWillAppearSEL]? NSLog (@ «отвечает»): NSLog (@ «не отвечает»); ' Возвращает **« отвечает »** сообщение – user1248568
@lxt нет, он хочет использовать vc, а не вид - также я не знаю, Если вы видите ошибку в 4 строках, указанных выше. он падает, когда вы устанавливаетеArgument –