zoukankan      html  css  js  c++  java
  • 二,Runtime进行动态添加方法

    运用场景:如果一个类方法非常多,加载类到内存的时候也比较耗费资源,需要给每个方法生成映射表,可以使用动态给某个类,添加方法解决。

    实现思路:外部调用方法,如果某个类没有实现这个方法,通过+ (BOOL)resolveInstanceMethod:(SEL)sel这个方法来映射某个类的方法

    某个类.m

    /** 如果没有实现方法 就会默认调用这个方法 **/

    + (BOOL)resolveInstanceMethod:(SEL)sel{

        if(sel == @selector(eat)){

            NSLog(@"eat");

            // 第一个参数:给哪个类添加方法

            // 第二个参数:添加方法的方法编号

            // 第三个参数:添加方法的函数实现(函数地址)

            // 第四个参数:函数的类型,(返回值+参数类型) v:void @:对象->self :表示SEL->_cmd

    //class_addMethod runtime的添加方法

            class_addMethod(self, @selector(eat), eat, "v@:");

        }

       return [super resolveInstanceMethod:sel]; 

    }

    //方法的函数实现(函数地址)

    void eat(id self,SEL sel){

        NSLog(@"%@ %@",self,NSStringFromSelector(sel));

        NSLog(@"====%d",1+1);

    }

    外部调用

     Person *p =  [[Person alloc]init];

    [p eat];   /// 或调用这个  [p performSelector:@selector(eat)];

    面试时问的使用过performSelector吗  一般隐藏的意思是用过runtime动态添加方法

  • 相关阅读:
    vue项目中使用axios上传图片等文件
    es6入门set和map
    自定义组件实现双向数据绑定
    vue watch详细用法
    bind,call,applay的区别
    前端路由两种模式:hash、history
    jsonp封装成promise
    正则元字符理解2
    webpack配置
    vuex的几个细节
  • 原文地址:https://www.cnblogs.com/liaolijun/p/7895792.html
Copyright © 2011-2022 走看看