Objective-C运行时编程指南之动态方法决议

动态方法决议

本章节描述怎么动态提供方法的实现。

动态方法决议

在有些情况下你可能想要动态提供方法实现。例如,Objective-C声明属性特征(参见Objective-C编程语言中的“声明属性”)包含@dynamic指令:

@dynamic propertyName;

这告诉编译器和这个属性相关的方法将会被动态提供。

你可以实现resolveInstanceMethod: 和resolveClassMethod:方法来分别地给实例方法和类方法动态提供指定选择器的实现。

一个Objective-C方法是一个简单的至少需要两个参数——self和_cmd的C函数。使用函数class_addMethod你可以给你一个类添加一个函数作为方法。因此,给出下面的函数:

void dynamicMethodIMP(id self, SEL _cmd) {

    // implementation ....

}

像下面一样使用resolveInstanceMethod:你可以给一个类动态地添加它作为一个方法(称作resolveThisMethodDynamically):

@implementation MyClass

+(BOOL)resolveInstanceMethod:(SEL)aSEL

{

      if (aSEL ==@selector(resolveThisMethodDynamically)) {

            class_addMethod([selfclass], aSEL, (IMP) dynamicMethodIMP, "v@:");

            return YES;

      }

      return [superresolveInstanceMethod:aSEL];

}

@end

转发方法(“消息转发”中有描述)和动态方法决议很大程度上来说是正交的。在转发机制进来之前,一个类有机会动态决议一个方法。如果respondsToSelector: 或者instancesRespondToSelector:被触发,动态方法决议器被给予首先为选择器提供一个IMP(函数指针)的机会。如果你实现了resolveInstanceMethod:但是想要特别的选择器通过转发机制确实地被转发,那么就让那些选择器返回NO。

动态加载

当Objective-C程序运行的时候它可以加载和链接新类和分类。新代码被包含在程序中并且和类和分类一样在开始的时候被加载。

动态加载可以被用作许多不同的事情。例如,系统偏好程序中的各个模块的动态加载。

在Cocoa环境中,动态加载通常被用于应用程序定制。其他可以写在运行时程序加载的模块——许多例如nterface Builder加载自定义调色板和OS X系统偏好程序加载自定义偏好模块。可加载的模块扩展了应用程序的功能。它们以你允许的方式有助于它,但是不可以预期或者自己定义。你提供框架,但其他人提供代码。

虽然有一个允许动态加载Mach-O文件(objc_loadModules,定义在objc/objc-load.h中)中的Objective-C模块的运行时函数,Cocoa的NSBundle类为动态加载提供了一个值得瞩目地更方便的接口——这个接口是面向对象的并且继承了相关的服务。

参考Foundation框架索引中的NSBundle类说明获取NSBundle类和它的使用的信息。参考OS X ABI Mach-O文件格式化索引获取Mach-O文件的信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值