[OC Runtime编程指南_翻译]五、动态方法解析

[OC Runtime编程指南_翻译]一、介绍 & 二、运行时版本和平台
[OC Runtime编程指南_翻译]三、与运行时交互
[OC Runtime编程指南_翻译]四、消息传递
[OC Runtime编程指南_翻译]五、动态方法解析
[OC Runtime编程指南_翻译]六、消息转发
[OC Runtime编程指南_翻译]七、类型编码
[OC Runtime编程指南_翻译]八、声明属性

注:pdf翻译文档百度云下载链接,密码:zcs2

本章描述如何动态地提供方法的实现。

动态方法解析

在某些情况下,您可能希望动态地提供方法的实现。例如,Objective-C声明属性特性(请参阅 _Objective-C _编程语言中的 声明属性)包括@dynamic指令:

@dynamic propertyName;

它告诉编译器将动态提供与属性关联的方法。

可以实现 resolveInstanceMethod:resolveClassMethod: 方法,分别为实例和类方法的给定选择器动态提供实现

Objective-C方法只是一个C函数,它至少有两个参数self_cmd。可以使用函数class_ addMethod将函数作为方法添加到类中。因此,考虑到以下功能:

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

可以使用resolveInstanceMethod将其作为方法(称为ResolveThisMethodDynamic)动态添加到类中,如下所示:

@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

转发方法(如消息转发中所述)和动态方法解析在很大程度上是正交的。在转发机制生效之前,类有机会动态解析方法。如果调用了respondsToSelector:instanceRespondToSelector:,则动态方法解析器将有机会首先为选择器提供IMP。如果实现resolveInstanceMethod:但希望通过转发机制实际转发特定的选择器,则为这些选择器返回NO

动态加载

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

动态加载可以用来做很多不同的事情。例如,系统首选项应用程序中的各个模块是动态加载的。

Cocoa环境中,通常使用动态加载来定制应用程序。其他人可以编写程序在运行时加载的模块,就像Interface Builder加载自定义调色板和OSX系统首选项应用程序加载自定义首选项模块一样。可加载模块扩展了应用程序的功能。他们以你所允许的方式为之做出贡献,但却无法预料或定义你自己。您提供框架,但其他人提供代码

尽管有一个运行时函数可以在Mach-O文件(objc_loadModules,在objc/objc load.h中定义)中执行Objective-C模块的动态加载,但是CocoaNSBundle类为动态加载提供了一个非常方便的接口,该接口面向对象并与相关服务集成。有关NSBundle类及其用法的信息,请参阅《基础框架参考》中的NSBundle类规范。有关Mach-O文件的信息,请参阅OS X ABI Mach-O文件格式参考。

猜你喜欢

转载自blog.csdn.net/lin1109221208/article/details/108395344