动态方法解决方案

笔者翻译自iOS Developer Library Dynamic Method Resolution

动态方法解决方案

这章解释了如何动态地提供一个方法的实现。

动态方法解决方案

有时候,你可能想动态地提供一个方法的实现。例如:Object-C 声明属性特性(参考 Object-C 编程语言中声明属性) 时包含了 @dynamic 指令:

<pre><code>@dynamic propertyName;
</code></pre>

这样就告诉编译器与该属性相对应的方法将被动态提供。

你能实现 resolveInstanceMethod:resolveClassMethod: 函数分别为实例方法和类方法提供动态方法实现。

Object-C 方法仅仅是一个至少带有两个参数(self_cmd)的C函数。你能使用 class_addMethod 给类添加一个函数作为类中的方法。

<pre><code>void dynamicMethodIMP(id self, SEL _cmd) {
// implementation ....
}
</code></pre>

你能使用 resolveInstanceMethod: 动态地将它添加到一个类作为类的实例方法(方法名为:resolveThisMethodDynamically),如下所示:

<pre><code>@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
    </code></pre>

消息转发(详见:Message Forwarding)和动态方法解决方案是相交的。一个类有机会在转发机制实现之前实现动态方法解决方案。如果 respondsToSelector:instancesRespondToSelector: 被调用,动态方法解决器将优先给函数选择器提供机会使它能绑定一个方法实现。如果你实现了 resolveInstanceMethod:,但希望指定的选择器被转发机制转发,你应该为这些选择器返回 NO

动态加载

Object-C 程序能在运行时加载和链接新的类和分类。新的代码将整合到程序中,并且与程序一开始加载的类和分类同等对待。

动态加载能被用作许多不同的情况。例如:在系统偏好应用中种类繁多的模块被动态加载。

Cocoa 环境中,动态加载通常被用作能被自定义定制的应用。其他人可以编写能在你的程序运行时加载的模块——就像 Interface Builder 加载用户调色板和 OS X 系统偏好设置应用加载用户偏好模块。这些可加载的模块扩展了你的应用功能。它们通过你允许但是你不能预测和自定义的方式实现。你提供了框架,但其他人提供代码。

尽管在 Mach-O 文件(objc_loadModules, 在 objc/objc-load.h 中定义)中,有能够动态加载 Object-C 模块的运行时函数, Cocoa NSBundle 类提供了更方便的动态加载接口——它是面向对象的且集成了很多相关的服务。在 Foundation 框架说明中参考 NSBundle 类的特性并获取更多 NSBundle 类的信息及如何使用它。参考 Mach-O 文件的 OS X ABI Mach-O File Format Reference 获取更多信息。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,824评论 0 9
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,786评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,027评论 19 139
  • 那么什么是模块化呢?《 Java 应用架构设计:模块化模式与 OSGi 》一书中对它的定义是:模块化是一种处理复杂...
    APOLOIZE阅读 12,505评论 0 5
  • 2016年8月8日我写了《陪你度过漫长的岁月》这篇文章,然后不小心被我删掉了找不回了,然后这里省略伤心难过的一千字...
    Roby枫落阅读 295评论 0 0