runtime动态添加方法属性

  • 动态添加方法

    • 一般我们定义一个类,添加一个方法

      • 定义一个person类
      • 添加一个方法eat,实现方法
      - (void)eat {
              NSLog(@"吃东西");
      }
      
      • 使用:
      Person *p = [[Person alloc] init];
      [p eat];
      
  • 这样的做法是:eat这个方法在person类初始化的时候就加入到内存序列中了,不管使用没使用


  • runtime动态添加方法

  • 同样的定义一个person类
  • 初始化调用 方法
    Person *p = [[Person alloc] init];
    //  这个时候调用eat,由于我们在类里面并没有定义方法,所以程序会崩溃,下面我们动态添加方法
    [p performSelector:@selector(eat)];
  • 动态添加方法(resolveInstanceMethod实现)
// 创建一个函数(方法的实现)
void eat(id self, SEL _cmd)
{
    NSLog(@"吃东西");
}

+ (BOOL)resolveInstanceMethod:(SEL)sel {
    
    // 判断是否调用的这个方法
    if (sel == @selector(eat)) {
        // 添加方法:当前类,方法,IMP,char(v:无返回值,@:(第一个参数)self,:(第二个参数)SEL)
        class_addMethod(self, sel, (IMP)eat, "v@:");
        // 执行完成
        return YES;
    }
    
    return [super resolveInstanceMethod:sel];
}

//   [p performSelector:@selector(eat)];现在我们调用就正常运行了

动态添加属性

  • 新建一个NSObject的扩展类,创建name属性
  • 实现set,get方法
- (void)setName:(NSString *)name {
    objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name {
    
    return objc_getAssociatedObject(self, @"name");
}
  • 使用:导入扩展包头文件
  NSObject *objc = [[NSObject alloc] init];
    objc.name = @"123";
    NSLog(@"%@",objc.name);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 猫猫分享,必须精品 原创文章,欢迎转载。转载请注明:翟乃玉的博客地址:http://www.jianshu.com...
    翟乃玉阅读 9,693评论 8 16
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,422评论 19 139
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,802评论 1 32
  • 本以为摆脱什么都要亲力亲为的初级运营岗位就会开启牛逼的人生,结果组建团队就让我欲仙欲死,在坑里差点爬不起来。不会组...
    影岳阅读 2,990评论 0 0
  • 性别女,肤质混油,痘痘肌,城墙皮,坐标广州 洗面奶篇 氨基酸洁面,泡沫浓密,略带点化工味,目前最喜欢的洗面奶!白天...
    象牙塔里的姑娘阅读 3,828评论 0 6