美文网首页
动态添加方法

动态添加方法

作者: xiari1991 | 来源:发表于2017-02-28 17:19 被阅读131次
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分类中为其他类添加方法,也是一样的,可以采用方式一

相关文章

网友评论

      本文标题:动态添加方法

      本文链接:https://www.haomeiwen.com/subject/oqoxgttx.html