Edited at

Methodの処理を差し替える - MethodSwizzling

More than 5 years have passed since last update.

はじめまして、おでんです。

なんかAdvent Calendarってのが流行ってるらしいので、乗っかってみました。

MethodSwizzlingは、Methodで行われる処理を差し替える手段のひとつです。

iOS向けの単純なサンプルを載せておきますので、実行してみて頂けると幸いです。


main.m

#import <objc/runtime.h>


@interface Test : NSObject

-(void)instanceMethod;

@end

@implementation Test

-(void)instanceMethod
{
NSLog(@"instanceMethod");
}

@end

int main(int argc, char *argv[])
{
@autoreleasepool
{
id block = ^{ NSLog(@"block"); };
id class = [Test class];
SEL sel = @selector(instanceMethod);
IMP imp = imp_implementationWithBlock(block);
Method method = class_getInstanceMethod(class, sel);
char* types = method_getDescription(method)->types;

id test = [[[Test alloc] init] autorelease];
[test instanceMethod]; // NSLog(@"instanceMethod");
class_replaceMethod(class, sel, imp, types);
[test instanceMethod]; // NSLog(@"block);

return 0;
}
}


MethodSwizzlingについて調べると長い説明から入ることが多く、

取っ付きにくい印象を受けている人が多いように感じられます。

なので取りあえずどうすれば動くのかだけを書いてみました。

説明なんてもんは飾りです。

エライ人にはそれがわからんのですよ。