私はメソッドの入れ替えをいじっていて、実行後に元の関数を呼び出したいmethod_exchangeImplementations
. このためにセットアップした2つのプロジェクトがあります。
最初のプロジェクトは、アプリケーションのメイン プロジェクトです。このプロジェクトには、アプリケーションのすべてのロジックが含まれています。originalMethodName
ビューが読み込まれるときに呼び出されることに注意してください。
@implementation ViewController
- (void)originalMethodName
{
NSLog(@"REAL %s", __func__);
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"REAL %s", __func__);
[self originalMethodName];
}
@end
2 番目のプロジェクトには、スウィズリングのコードのみが含まれています。関数を呼び出しswizzle_originalMethodName
てメインアプリケーションに挿入したいコードを含むメソッドがあります。originalMethodName
@implementation swizzle_ViewController
- (void)swizzle_originalMethodName
{
NSLog(@"FAKE %s", __func__);
}
__attribute__((constructor)) static void initializer(void)
{
NSLog(@"FAKE %s", __func__);
Class c1 = objc_getClass("ViewController");
Class c2 = [swizzle_ViewController class];
Method m1 = class_getInstanceMethod(c1, @selector(originalMethodName));
Method m2 = class_getInstanceMethod(c2, @selector(swizzle_originalMethodName));
method_exchangeImplementations(m1, m2);
}
@end
スウィズルは問題なく動作しています (以下の出力を参照) originalMethodName
。swizzle_originalMethodName
2016-08-17 14:18:51.765 testMacOS[7295:1297055] FAKE initializer
2016-08-17 14:18:51.822 testMacOS[7295:1297055] REAL -[ViewController viewDidLoad]
2016-08-17 14:18:51.822 testMacOS[7295:1297055] FAKE -[swizzle_ViewController swizzle_originalMethodName]
私は使用しようとしましNSInvocation
たが、運がありません。私が間違っていることはありますか?
Class c1 = objc_getClass("ViewController");
Method m1 = class_getInstanceMethod(c1, @selector(originalMethodName));
NSMethodSignature *methodSignature = [NSMethodSignature signatureWithObjCTypes:method_getTypeEncoding( m1)];
NSInvocation *originalInvocation = [NSInvocation invocationWithMethodSignature:methodSignature];
[originalInvocation invoke];