动态方法解析
本章介绍如何提供动态方法的实现。
动态方法解析
在某些情况下,您可能希望动态地提供方法的实现。例如,Objective-C声明的属性功能(参见Objective-C编程语言中的声明属性)包含指令:@dynamic
@dynamic propertyName;
它告诉编译器将动态提供与属性关联的方法。
您可以实现这些方法resolveInstanceMethod:
,resolveClassMethod:
并分别为实例和类方法动态提供给定选择器的实现。
Objective-C方法只是一个C函数,至少需要两个参数 - self
和_cmd
。您可以使用该函数将函数作为方法添加到类中class_addMethod
。因此,给出以下功能:
void dynamicMethodIMP(id self, SEL _cmd) {
// implementation ....
}
您可以resolveThisMethodDynamically
使用以下方法将其作为方法(调用)动态添加到类中resolveInstanceMethod:
:
@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:
或instancesRespondToSelector
被调用,动态方法解析器有机会首先为选择器提供IMP
。如果您实现resolveInstanceMethod:
但希望通过转发机制实际转发特定选择器,则返回NO
这些选择器。
动态加载
Objective-C程序可以在它在运行时加载和链接新类 和类别。新代码被合并到程序中,并且与开始时加载的类和类别完全相同。
动态加载可用于执行许多不同的操作。例如,系统首选项应用程序中的各种模块是动态加载的。
在Cocoa环境中,动态加载通常用于允许自定义应用程序。其他人可以编写程序在运行时加载的模块 - 就像Interface Builder加载自定义调色板并且OS X系统首选项应用程序加载自定义首选项模块一样。可加载模块扩展了应用程序的功能。他们以您允许的方式为其做出贡献,但无法预测或定义自己。您提供框架,但其他人提供代码。
虽然有一个运行时函数可以在Mach-O文件中动态加载Objective-C模块(objc_loadModules
,定义于objc/objc-load.h
),可可的NSBundle
class为动态加载提供了一个非常方便的接口 - 一个面向对象并与相关服务集成的接口。有关NSBundle
类NSBundle
及其用法的信息,请参阅Foundation框架参考中的类规范。请参见OS X ABI Mach-O文件格式参考 有关Mach-O文件的信息。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论