Objective-C 运行时编程指南 之 Dynamic Method Resolution

本章介绍了如何动态的提供一个方法的实现。

4.1 Dynamic Method Resolution 动态方法解析

有时候,你可能想要动态的提供一个方法的实现。例如,Objective-C声明属性特征(参见《The Objective-C Programming Language》中的《Declared Properties》)包含了@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([self class], aSEL, (IMP) dynamicMethodIMP, "v@:");
          return YES;
    }
    return [super resolveInstanceMethod:aSEL];
}
@end

消息转发(见《 Message Forwarding 》)和动态方法解析很大程度上是正交的。一个类有机会在进入转发机制之前动态的解析一个方法。如果调用了 respondsToSelector: 或 instancesRespondToSelector: ,动态方法解析器就得到一个机会先提供为选择器提供一个 IMP 。如果你实现了 resolveInstanceMethod: ,但是想要某些特别的选择器实际上通过转发机制转发,你只需要对这些选择器返回 NO 。

4.2 Dynamic Loading 动态加载

Objective-C程序可以在运行时加载和连接新的类和分类。新的代码被合并到程序中,并且与开始时加载的类和类别同样的处理。

动态加载可以用于完成许多不同的工作。例如,系统偏好应用中的各种各样的模块都是动态加载的。

在Cocoa环境中,动态加载通常允许应用被自定义。其他人可以编写模块而你的程序在运行时加载它们——非常像Interface Builder加载自定义调色板和OS X系统偏好应用加载自定义偏好模块。可加载的模块扩展了应用程序可以做的事。它们通过你允许但是没有预定或者自己定义的方式贡献出来。你提供框架,而其他人提供代码。

尽管在Mach-O文件中有执行Objective-C模块的动态加载的方法(objc_loadModules,定义在 objc/objc-load.h 文件中),Cocoa的NSBundle类提供了明显更加方便的方法实现动态加载——一个面向对象且集成了相关服务的方法。参见Foundation框架参考中的NSBundle类说明以获取关于NSBundle类及其使用的信息。参见《OS X ABI Mach-O File Format Reference》获取关于Mach-O文件的信息。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值