动态方法解析
Last updated
Was this helpful?
Last updated
Was this helpful?
本章介绍如何提供动态方法的实现。
在某些情况下,您可能希望动态地提供方法的实现。例如,Objective-C声明的属性功能(参见中)包含指令:@dynamic
它告诉编译器将动态提供与属性关联的方法。
您可以实现这些方法,并分别为实例和类方法动态提供给定选择器的实现。
Objective-C方法只是一个C函数,至少需要两个参数 - self
和_cmd
。您可以使用该函数将函数作为方法添加到类中。因此,给出以下功能:
您可以resolveThisMethodDynamically
使用以下方法将其作为方法(调用)动态添加到类中resolveInstanceMethod:
:
Objective-C程序可以在它在运行时加载和链接新类 和类别。新代码被合并到程序中,并且与开始时加载的类和类别完全相同。
动态加载可用于执行许多不同的操作。例如,系统首选项应用程序中的各种模块是动态加载的。
在Cocoa环境中,动态加载通常用于允许自定义应用程序。其他人可以编写程序在运行时加载的模块 - 就像Interface Builder加载自定义调色板并且OS X系统首选项应用程序加载自定义首选项模块一样。可加载模块扩展了应用程序的功能。他们以您允许的方式为其做出贡献,但无法预测或定义自己。您提供框架,但其他人提供代码。
转发方法(如)和动态方法解析在很大程度上是正交的。类有机会在转发机制启动之前动态解析方法。如果或被调用,动态方法解析器有机会首先为选择器提供IMP
。如果您实现但希望通过转发机制实际转发特定选择器,则返回NO
这些选择器。
虽然有一个运行时函数可以在Mach-O文件中动态加载Objective-C模块(objc_loadModules
,定义于objc/objc-load.h
),可可的NSBundle
class为动态加载提供了一个非常方便的接口 - 一个面向对象并与相关服务集成的接口。有关类NSBundle
及其用法的信息,请参阅Foundation框架参考中的类规范。请参见OS X ABI Mach-O文件格式参考 有关Mach-O文件的信息。