次のコードは例外をスローします。
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 instancesRespondToSelector:viewWillAppearSEL] ですか? NSLog(@"応答する") : NSLog(@"応答しない");
また、直後にクラッシュし[invocation setSelector:viewWillAppearSEL];
ます。そのため、トピック タイトルをUnexpected exception with 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");
}