1.动态添加方法,首先定义添加的函数
对于自己提前定义的方法eat:来说,很明显这是c语音定义的方法,与平常方法不同的是他多了两个参数,其实OC当中每个方法里面都有这两个参数,他们是隐藏参数,一个代表本身,另一个代码的是方法名SEL
/**
* 吃方法
*
* @param self 隐藏参数 self
* @param _cmd 隐藏参数 SEL
* @param param 参数
*/
void eat(id self, SEL _cmd, NSString *param){
NSLog(@"调用eat 参数:1%@ 参数2:%@ 参数3:%@",self,NSStringFromSelector(_cmd),param);
}
2.动态添加
/**
* 动态添加方法
*
* @param self cls:为哪个类添加方法
* @param sel SEL:添加方法的方法编号(方法名)是什么
* @param IMP IMP:方法实现
* @param const char * types方法类型
*
* @return 返回是否添加成功
*/
BOOL isSuccess = class_addMethod(self, sel, (IMP)eat, "v@:@");
最后一个参数:可以通过查阅官方文档了解
如果需要带两个对象,则可以写成 "v@:@@"
如果需要带两个基本数据类型,如float,则可以写成"v@:ff"
如果返回值是对象,则可以写成"@@:ff"
实例一
1.当UIView 类加载时就添加方法
void eat(id self, SEL _cmd) {
NSLog(@"uiview 调用了eat方法");
}
+ (void)load {
class_addMethod(self, NSSelectorFromString(@"eat"), (IMP)eat, "v@:");
}
调用:[view performSelector:@selector(eat)];
2.当调用时才添加方法
void eat(id self, SEL _cmd) {
NSLog(@"uiview 调用了eat方法");
}
// 当一个对象调用未实现的方法,会调用这个方法处理,并且会把对应的方法列表传过来.
// 刚好可以用来判断,未实现的方法是不是我们想要动态添加的方法
+ (BOOL)resolveInstanceMethod:(SEL)sel {
if (sel == NSSelectorFromString(@"eat")) {
class_addMethod(self, sel, (IMP)eat, "v@:");
return YES;
}
}
调用:[view performSelector:@selector(eat)];
3.当然也是可以在uiview分类中为其他类添加方法,也是一样的,可以采用方式一