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

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: [OC Runtime编程指南_翻译]五、动态方法解析

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


动态方法解析


在某些情况下,您可能希望动态地提供方法的实现。例如,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文件格式参考。

相关文章
|
6天前
|
机器学习/深度学习 算法 数据挖掘
算法金 | K-均值、层次、DBSCAN聚类方法解析
**摘要:** 这篇文章介绍了聚类分析的基本概念和几种主要的聚类算法。聚类是无监督学习中用于发现数据内在结构的技术,常用于市场分析、图像分割等场景。K-均值是一种基于划分的算法,简单高效但易受初始值影响;层次聚类包括凝聚和分裂方式,形成层次结构但计算复杂;DBSCAN基于密度,能处理任意形状的簇,但参数选择敏感。文章还讨论了这些算法的优缺点和适用场景,并提供了相关资源链接和Python实现。
31 9
算法金 | K-均值、层次、DBSCAN聚类方法解析
|
1天前
|
IDE Java 编译器
深入解析JAVA注解:元数据如何改变编程世界
【6月更文挑战第29天】Java注解,作为元数据机制,为代码增添上下文信息,改变编程方式。注解标记在类、方法等上,不直接影响执行,但为编译器等提供额外信息。分为元注解、编译时和运行时注解,用于元数据提供、代码简化、提高可读性及自动化。示例展示了定义`@Loggable`注解来标记日志记录方法。注解广泛应用于依赖注入、ORM、Web服务等,提升效率和灵活性,是现代Java开发的关键。未来其应用将更广泛。
11 3
|
2天前
|
存储 算法 安全
深入解析 X509Certificate:成员变量与方法详解
深入解析 X509Certificate:成员变量与方法详解
11 2
|
5天前
|
Java 程序员 调度
Java并发编程之Executor框架深度解析
【6月更文挑战第24天】在Java的并发编程领域,Executor框架是处理多线程任务的核心。本文将深入探讨Executor框架的设计哲学、核心组件以及如何高效利用这一框架来提升程序的性能和响应性。我们将通过实例演示如何正确配置和使用Executor,并讨论常见的陷阱与最佳实践。
|
2天前
|
安全 Java UED
深度解析Java中方法内的异步调用实践与应对方案
深度解析Java中方法内的异步调用实践与应对方案
8 1
|
2天前
|
JSON 安全 Java
深入解析Jackson的ObjectMapper:核心功能与方法指南
深入解析Jackson的ObjectMapper:核心功能与方法指南
9 1
|
3天前
|
Java 数据库连接
提升编程效率的利器: 解析Google Guava库之IO工具类(九)
提升编程效率的利器: 解析Google Guava库之IO工具类(九)
|
5天前
|
数据采集 算法 BI
解析numpy中的iscomplex方法及实际应用
在 NumPy 中,iscomplex 函数用于检查数组中的每个元素是否为复数。这个函数在处理包含复数数据的数组时非常有用,尤其是在科学计算和工程领域,这些领域经常需要区分实数和复数。 在数学和工程领域,复数是一种基本的数值类型,它们扩展了实数系统,包含了实部和虚部。在 NumPy 中,复数由 numpy.complex128 或 numpy.complex64 类型表示。numpy.iscomplex 函数提供了一种简便的方式来检查数组中的元素是否为复数。这对于数据类型判断、数据清洗和后续的数值分析非常重要。
|
14小时前
|
XML JavaScript Java
解析XML文件的几种方法
解析XML文件的几种方法
|
15小时前
|
存储 Java 数据库
解析和使用String数组的方法
解析和使用String数组的方法

推荐镜像

更多