class_addMethod使用(官方文檔不放了)
class_addMethod(Class cls, SEL name, IMP imp,const char *types)
舉例:
Person *p = [[Person alloc]init];
class_addMethod([Person class],
@selector(printPerson),class_getMethodImplementation([ViewController class], @selector(find)), "v@:");
解釋:
- Class cls: 我們需要一個(gè)class,比如我的[Person class],就是我們即將動(dòng)態(tài)添加方法的類
- SEL name: 這個(gè)名字自己可以隨意想,就是添加的方法在本類里面叫做的名字,但是方法的格式一定要和你需要添加的方法的格式一樣,比如有無(wú)參數(shù)。(調(diào)用的時(shí)候就是用的這個(gè)方法名)
- IMP imp:IMP就是Implementation的縮寫,它是指向一個(gè)方法實(shí)現(xiàn)的指針,每一個(gè)方法都有一個(gè)對(duì)應(yīng)的IMP。這里需要的是IMP,所以你不能直接寫方法,需要用到一個(gè)方法:OBJC_EXPORT IMP class_getMethodImplementation(Class cls, SEL name)
__OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
這個(gè)方法也是runtime的方法,就是獲得對(duì)應(yīng)的方法的指針,也就是IMP。
- const char *types:
比如:”v@:”意思就是這已是一個(gè)void類型的方法,沒(méi)有參數(shù)傳入。
再比如 “i@:”就是說(shuō)這是一個(gè)int類型的方法,沒(méi)有參數(shù)傳入。
再再比如”i@:@”就是說(shuō)這是一個(gè)int類型的方法,又一個(gè)參數(shù)傳入。
最終意思就是為Person這個(gè)類動(dòng)態(tài)添加一個(gè)方法,方法名叫做printPerson(),方法的實(shí)現(xiàn)是ViewController這個(gè)類里面的find方法的實(shí)現(xiàn),也就是對(duì)應(yīng)的IMP這個(gè)指針,最后就是參數(shù)及返回類型了,無(wú)參無(wú)返回:
對(duì)應(yīng)這句代碼:
@selector(printPerson),class_getMethodImplementation([ViewController class], @selector(find)), "v@:"); ```
最后調(diào)用的時(shí)候用這句代碼:
`` [p performSelector:@selector(printPerson)]; ``
這樣你的Person這個(gè)類里并沒(méi)有printPerson()這個(gè)方法,但是卻執(zhí)行了這個(gè)方法.