iOS - Objective-C语言的动态性

news/2025/1/15 6:52:03/

Objective-C 的动态性主要由以下几个关键特性和机制支撑:

1. 动态消息传递

// 消息传递机制
id objc_msgSend(id self, SEL _cmd, ...) {// 1. 获取类信息Class cls = object_getClass(self);// 2. 查找方法实现IMP imp = lookUpImpOrForward(cls, _cmd);// 3. 执行方法return imp(self, _cmd, ...);
}// 动态调用
[object performSelector:@selector(methodName)];

2. 动态类型

// id 类型
id obj = [[NSObject alloc] init];// 动态类型检查
if ([obj isKindOfClass:[NSString class]]) {// 运行时检查类型
}
  • id 类型:可以指向任何对象,类型信息在运行时确定。
  • 动态类型检查:使用 isKindOfClass: 和 respondsToSelector: 等方法在运行时检查类型。

3. 动态方法解析

// 动态方法解析
+ (BOOL)resolveInstanceMethod:(SEL)sel {if (sel == @selector(dynamicMethod)) {class_addMethod(self, sel, (IMP)dynamicMethodIMP, "v@:");return YES;}return [super resolveInstanceMethod:sel];
}
  • 方法解析:在运行时动态添加方法实现。
  • resolveInstanceMethod::允许在方法未找到时提供实现。

4. 方法交换 (Method Swizzling)

// 方法交换
Method originalMethod = class_getInstanceMethod(self, @selector(originalMethod));
Method swizzledMethod = class_getInstanceMethod(self, @selector(swizzledMethod));
method_exchangeImplementations(originalMethod, swizzledMethod);

5. 动态类和对象

// 动态创建类
Class newClass = objc_allocateClassPair([NSObject class], "NewClass", 0);
objc_registerClassPair(newClass);// 动态添加属性
class_addIvar(newClass, "dynamicIvar", sizeof(id), log2(sizeof(id)), @encode(id));
  • 动态类创建:可以在运行时创建新类。
  • 动态属性和方法:可以在运行时添加属性和方法。

6. 关联对象

// 关联对象
objc_setAssociatedObject(obj, @selector(associatedObject), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
id value = objc_getAssociatedObject(obj, @selector(associatedObject));
  • 关联对象:在运行时为对象动态添加属性。

7. 反射机制

// 反射
Class cls = [obj class];
Method *methods = class_copyMethodList(cls, &methodCount);
  • 反射:在运行时获取类和对象的详细信息。

8. 运行时库

  • Objective-C Runtime Library:提供了丰富的 API 支持动态特性,如 objc_getClass、class_addMethod、method_getImplementation 等。

这些特性使得 Objective-C 能够在运行时灵活地处理对象和方法,支持动态行为和元编程。


http://www.ppmy.cn/news/1563250.html

相关文章

MySQL(高级特性篇) 04 章——逻辑架构

一、逻辑架构剖析 (1)服务器处理客户端请求 那服务器进程对客户端进程发送的请求做了什么处理,才能产生最后的处理结果呢?这里以查询请求为例展示:下面具体展开看一下:Connectors是MySQL服务器之外的客户…

算法妙妙屋-------2..回溯的奇妙律动

回溯算法是一种用于系统性地搜索和解决问题的算法,它以深度优先搜索(DFS)为基础,用来探索所有可能的解决方案。通过递归地尝试候选解并在必要时回退(即“回溯”),它能够高效地解决许多涉及组合、…

SQL LAST()

SQL中的LAST()函数是一个用于返回指定列中最后一个记录值的函数。然而,需要注意的是,这个函数并不是SQL标准的一部分,因此并不是所有数据库系统都支持它。具体来说,只有MS Access直接支持LAST()函数【0†source】。 在其他数据库…

fastGpt 本地运行 mongo, 要加 directConnection=true 参数

fastGpt 本地运行 mongo psql用docker的 文件复制 FastGPT\projects\app.env.template 复制为 FastGPT\projects\app.env.local 本地 连接docker的mongo, 要加 directConnectiontrue 参数 MONGODB_URImongodb://myusername:mypasswordlocalhost:27017/fastgpt?authSourceadmi…

Java中的反射机制及其应用场景

目录 什么是Java反射机制? 工作原理 主要应用场景 注意事项 总结 什么是Java反射机制? Java反射机制是一种强大的工具,它允许程序在运行时访问、检查和修改其本身的类和对象的信息。通过反射,开发者可以在不知道类的具体实现…

机器学习与人工智能的关系

机器学习与人工智能的关系 一、人工智能二、机器学习2.1 机器学习与人工智能的关系2.2 机器学习的本质 三、其他玩艺 曾几何时,人工智能还是个科幻名词,仿佛只属于未来世界。如今,它已经渗透到了我们生活的方方面面,成为顶流。我们…

Ubuntu上,ffmpeg如何使用cuda硬件解码、编码、转码加速

本文使用 Ubuntu 环境。Ubuntu 直接使用 APT 安装的就支持 CUDA 加速。本文使用这样下载的版本进行演示,你自己编译或者其他源的版本可能会不同。 ffmpeg 的一些介绍,以及 macOS 版本的 ffmpeg 硬件加速请见《macOS上如何安装(不需要编译安装…

自动化日常任务:使用Python和PyAutoGUI打开记事本并保存文本

自动化日常任务:使用Python和PyAutoGUI打开记事本并保存文本 概述准备工作效果代码 概述 在日常工作中,我们经常会遇到一些重复性的任务,这些任务虽然简单,但却耗费了大量时间。幸运的是,随着自动化技术的发展&#x…