iOS - Objective-C语言的动态性

ops/2025/1/15 23:11:38/

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/ops/150410.html

相关文章

ip属地出省会变吗?怎么出省让ip属地不变

在数字化时代,IP属地作为网络身份的一个重要标识,不仅影响着我们的网络体验,还与网络安全、隐私保护等方面息息相关。当我们跨省移动时,是否会遇到IP属地变化的问题?如果希望保持IP属地不变,又该如何操作呢…

linux 网络安全不完全笔记

一、安装Centos 二、Linux网络网络环境设置 a.配置linux与客户机相连通 b.配置linux上网 三、Yum详解 yum 的基本操作 a.使用 yum 安装新软件 yum install –y Software b.使用 yum 更新软件 yum update –y Software c.使用 yum 移除软件 yum remove –y Software d.使用 yum …

用css和html制作太极图

目录 css相关参数介绍 边距 边框 伪元素选择器 太极图案例实现、 代码 效果 css相关参数介绍 边距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …

Web前端------HTML多媒体标签之图片标签

一.图片标签介绍 1.路径问题>.绝对路径从盘符开始的路径问题&#xff1a;改变了工程目录的位置后&#xff0c;绝对路径从盘符开始则不能使用了&#xff0c;考虑相对路径>.相对路径从当前位置&#xff08;指从代码书写.html文件&#xff09;开始如何表示当前位置------使用…

强化风险防控:助贷 CRM 系统为助贷中介筑牢安全堤坝

对于助贷中介公司而言&#xff0c;风险防控无疑是关系到生死存亡的关键环节。在复杂多变的市场环境下&#xff0c;传统的风险管控手段漏洞百出&#xff0c;而助贷 CRM 系统的出现&#xff0c;为筑牢安全堤坝提供了坚实保障。 贷前审查阶段&#xff0c;公司以往仅能通过有限的资…

Mac操作系统zip压缩加密

介绍 在苹果电脑上使用zip压缩文件夹&#xff0c;并设置密码。 命令 命令行输入命令后&#xff0c;按下回车后&#xff0c;输入压缩密码。 zip -er aa.zip aa #-e选项启用了ZIP的加密功能 #-r选项表示你想要递归地压缩文件夹 #aa.zip压缩后的文件名 #aa要压缩的文件夹

成功案例分享 — 芯科科技助力涂鸦智能打造Matter over Thread模块,简化Matter设备开发

芯科科技&#xff08;Silicon Labs&#xff09;的愿景之一是让开发者每天都能够更轻松地开发无线物联网&#xff08;IoT&#xff09;。特别是在拥有相同愿景的合作伙伴的帮助下&#xff0c;我们每天都在取得进步。但是要想弥合知识水平和物联网开发之间的差距仍会面临一定的挑战…

k8s故障 ImagePullBackOff状态排错

需看yaml 这个策略是否开启