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: 我們需要一個class,比如我的[Person class],就是我們即將動態添加方法的類
- SEL name: 這個名字自己可以隨意想,就是添加的方法在本類里面叫做的名字,但是方法的格式一定要和你需要添加的方法的格式一樣,比如有無參數。(調用的時候就是用的這個方法名)
- IMP imp:IMP就是Implementation的縮寫,它是指向一個方法實現的指針,每一個方法都有一個對應的IMP。這里需要的是IMP,所以你不能直接寫方法,需要用到一個方法:OBJC_EXPORT IMP class_getMethodImplementation(Class cls, SEL name)
__OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
這個方法也是runtime的方法,就是獲得對應的方法的指針,也就是IMP。
- const char *types:
比如:”v@:”意思就是這已是一個void類型的方法,沒有參數傳入。
再比如 “i@:”就是說這是一個int類型的方法,沒有參數傳入。
再再比如”i@:@”就是說這是一個int類型的方法,又一個參數傳入。
最終意思就是為Person這個類動態添加一個方法,方法名叫做printPerson(),方法的實現是ViewController這個類里面的find方法的實現,也就是對應的IMP這個指針,最后就是參數及返回類型了,無參無返回:
對應這句代碼:
@selector(printPerson),class_getMethodImplementation([ViewController class], @selector(find)), "v@:"); ```
最后調用的時候用這句代碼:
`` [p performSelector:@selector(printPerson)]; ``
這樣你的Person這個類里并沒有printPerson()這個方法,但是卻執行了這個方法.