runtime系列3--Dynamic Method Resolution-方法的动态决议

本章介绍如何提供方法的动态决议

有时候我们想要为一个方法动态地提供实现,比如Objective-C的@dynamic指示符,它告诉编译器与属性对应的方法是动态提供的。

@dynamic propertyName;


我们可以利用resolveInstanceMethod:resolveClassMethod:分别为对象方法和类方法提供动态实现。一个Objective-C方法本质上是一个拥有至少两个参数(self和_cmd)的C函数,我们可以利用class_addMethod向一个类添加一个方法。比如对于下面的函数:

我们可以利用resolveInstanceMethod:将它添加成一个方法(比如叫resolveThisMethodDynamically): 


  1. void dynamicMethodIMP (id self, SEL _cmd) {  
  1.      // implementation ….   
  1. }  

  1. @implementation MyClass  

  1. + (BOOL)resolveInstanceMethod:(SEL)aSEL  
  1. {  
  1.      if (aSEL == @selector(resolveThisMethodDynamically)) {  
  1.           class_addMethod( [self class],  aSEL, (IMP) dynamicMethodIMP, "v@:");  
  1.           return YES;  
  1.      }  
  1.      return [super resolveInstanceMethod:aSEL];  
  1. }  

  1. @end  

动态决议和发送消息并不冲突,在消息机制起作用之前,一个类是有机会动态决议一个方法的。当 respondsToSelector: 或者 instancesRespondToSelector: 被激活时,dynamic method resolver会优先有个机会为这个selector提供一份实现。如果实现了 resolveInstanceMethod: ,对于不想动态决议而想让其遵循消息转发机制的selectors,返回NO即可。

 Dynamic Loading--动态加载

Objective-C程序可以在运行时链接新的类和category。动态加载可以用来做很多不同的事情,比如System Preferences里头各种模块就是动态加载的。尽管有运行时函数可以动态加载Objective-C模块(objc/objc-load.h中的objc_loadModules),但Cocoa的NSBundle类提供了更方便的动态加载接口。



我们可以利用resolveInstanceMethod:resolveClassMethod:分别为对象方法和类方法提供动态实现。一个Objective-C方法本质上是一个拥有至少两个参数(self和_cmd)的C函数,我们可以利用class_addMethod向一个类添加一个方法。比如对于下面的函数:

我们可以利用resolveInstanceMethod:将它添加成一个方法(比如叫resolveThisMethodDynamically): 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值