iOS runtime动态添加方法

本文讲解了在Objective-C中为何及如何动态给类添加方法,以减少内存消耗和灵活调用未实现方法,避免错误。介绍了核心API如resolveInstanceMethod和class_addMethod,并通过实例演示了整个过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1. 为什么要给一个类动态添加方法?

  如果一个类有很多的方法, 当我们加载这个类的时候会比较消耗内存资源, 需要给每个方法生成映射表,  我们可以动态给这个类添加方法

2. 一个类动态添加方法的好处?

  1. 减少加载类是内存的消耗

  2. 可以调用一个未实现的方法和去除报错

3. 主要使用的api

  1. + (BOOL)resolveInstanceMethod:(SEL)sel; // 被调用的方法实现部分没有找到,而消息转发机制启动之前的这个中间时刻。

  2. class_addMethod(<#Class  _Nullable __unsafe_unretained cls#>, <#SEL  _Nonnull name#>, <#IMP  _Nonnull imp#>, <#const char * _Nullable types#>)               // 为一个类动态添加方法

  <#Class  _Nullable __unsafe_unretained cls#>: 为哪一个类添加方法  

  <#SEL  _Nonnull name#>: 方法的注册名称 

  <#IMP  _Nonnull imp#>: 方法的指针, 可以通过class_getMethodImplementation(Class cls, SEL name)来获取

  <#const char * _Nullable types#>: 方法返回值类型, 入参; 比如: "v@:@", v: 返回的参数类型, @:代表自己, @一个参数

4. 调用performSelector: 是运行时系统负责去找方法的,在编译时候不做任何校验;如果直接调用编译是会自动校验。

5. 实例:

  //动态添加一个方法

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

  class_addMethod([Person class], @selector(printPerson), class_getMethodImplementation([ViewController class], @selector(find)), "v@:");

  [p performSelector:@selector(printPerson)];



        

 

转载于:https://www.cnblogs.com/diweinan/p/9718348.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值