返回介绍

动态方法解析

发布于 2024-10-06 10:34:44 字数 8169 浏览 0 评论 0 收藏 0

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

动态方法解析

在某些情况下,您可能希望动态地提供方法的实现。例如,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),可可的NSBundleclass为动态加载提供了一个非常方便的接口 - 一个面向对象并与相关服务集成的接口。有关NSBundleNSBundle及其用法的信息,请参阅Foundation框架参考中的类规范。请参见OS X ABI Mach-O文件格式参考 有关Mach-O文件的信息。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文