Objective-C的运行时机制,反射机制

利用Objective-C的反射机制和运行时特性实现类静态方法的动态访问(一) 利用Objective-C的反射机制和运行时特性实现类静态方法的动态访问,解决不能使用NSObject类的反射方法 performSelector 访问静态方法的坑爹问题! 阅读详情

Objective-C的运行时机制,反射机制

1、获取类信息

NSArray等集合对象中不限制所存储的对象类型,只要它是一个NSObject就行,如果想知道我们刚刚放进去的对象是什么类型,可发送class消息:

id class = [[arrayobjectAtIndex:0]class];

2、选择器

选择器@selector,用于查询对象的某个方法。

3、类的动态创建

要在代码中创建类,而不是通过静态的.h和.m文件定义类,可以使用Object C运行时库API(#import<objc/runtime.h>)

Class newClz =objc_allocateClassPair([NSError class],”RuntimeErrorSubclass”,0);

class_addMethod(newClz,@selector(retort), (IMP)ReportFunction, “v@:”);

shiyongobjc_allocateClassPair动态函数创建一个类,并在参数中指明该类的父类和类名。用class_addMethod函数为该类增加了一个方法report,这个方法是由函数ReportFunction实现的,由于该函数至少应包含两个参数self和_cmd,因此该方法有3个参数,类型分别为v、@、:(一个返回值,self,_cmd)。

v代表void,指定了方法的返回值;@代表了id类型(对象),制定了方法的固定参数self;:表示了选择器类型(SEL),指定了固定参数_cmd。因此ReportFunction应当实现为:

voidReportFunction(id self, SEL _cmd)

{

       //实现代码

}

新类被注册为类对(Class Pair)

类对注册后,即可在代码中使用

id obj = [[newClzalloc]init];

[objperformSelector:@selector(report)];

[obj release];

4、类的动态加载

Class clz =NSClassFromString(@”MyClass”);

返回对象为“类对象”Class。通过这种方法,从字符串构建类实例就不再是什么问题了

id obj = [[clzalloc]init];

或者

id obj =[[NSClassFromString(@”MyClass”) alloc]init];

这使得我们可以在运行时而不是编译时加载类,同时,不需要#import”MyClass”.

 

4、方法的动态调用

通过@selector关键字可以在一定程度上实现方法的动态调用。更动态的方式是通过Fundation框架的NSSelectorFromString函数,可以直接从字符串获取一个选择器:

SEL sel =NSSelectorFormString(@”doSonethingMethod:”);

if([objectresponsToSelector:sel]){

       [object performSelector:sel withObject:color];

}

UC2844反激电源EMI设计:从噪声源到量产一致性全解析 开关电源的EMI设计是工程实践中的核心挑战,其本质是理解噪声源、传播路径与滤波网络的阻抗匹配关系。反激拓扑因硬开关、漏感储能和RCD钳位振铃,EMI问题尤为突出。通过优化变压器绕制工艺、PCB布局和滤波器参数,可显著抑制传导与辐射噪声。UC2844作为经典电流模式PWM控制器,其固定频率特性和前沿消隐功能为EMI设计提供了可控抓手。本文围绕UC2844反激电源,系统拆解EMI模块架构、关键元件计算、实操调试步骤及量产一致性控制,帮助工程师从噪声源定位到整改落地,实现低成本、高可靠性的EMI设计。 阅读详情

相关推荐

EDA工具安装第一步:Synopsys Installer的配置与图形化界面使用详解

本文详细解析了EDA工具安装的关键第一步——Synopsys Installer的配置与使用。文章阐述了其作为统一部署管理器和依赖协调者的核心作用,并分步详解了如何通过图形化界面高效安装EDA工具,同时介绍了命令行批处理等进阶技巧,旨在帮助工程师快速搭建稳定的芯片设计环境。

zeta9的博客 341

NSClassFromString那点事

相信码农们都听说过反射这个词,今天要说的iOS下的反射使用方法。虽然在Object-C和Swift中都使用NSClassFromString这个方法,但是在使用过程中还是有细微的差别。具体看下面的代码注释吧 Object-C中使用 Class urlClass = NSClassFromString(controllerValue); //controllerValue为待反射的类名

1618

工作:三菱PLC与伺服之CC-Link IE Field Network通讯应用

CC-LINK-IE

好记性不如烂笔头 2万+

Objective-C反射机制

Objective-C反射机制

yangmeng13930719363的专栏 3449

车企常用架构、通信设计、需求管理工具全汇总

车辆技术是个系统工程,比较大,需要多人协作。“协作”往往需要工具参与,才能保证协作过程的高效、有条不紊。 【文章系转载,出处见图片水印】 今天我们就来捋一捋汽车行业常用的架构、网络开发工具~ Preevision 大名鼎鼎的Preevision,来自大名鼎鼎的Vector。 个人觉得,它是Vector公司最牛逼、最神秘、最高高在上的产品,犹如空谷回响、千里传音,但是很少看到它真正落地。 它最引以为傲的,或许是在给客户做介绍的时候,说“我们甚至能够精确到每一根线束的长度”,但是反观.

MaveDiao的博客 3484

RK3568平台开发系列讲解(项目篇)手写数字识别

📢 本篇章带大家基于飞桨(PaddlePaddle),完成一个简单的手写数字识别任务。

内核笔记 1182

Object-C之反射

[1] 获取class 主要三种方式 // 字符串获取class Class clazz = NSClassFromString(@"FKPerson"); // 根据类获取class clazz = [FKPerson class]; // 根据对象获取class FKPerson *person = [[FKPerson alloc] i

小卓子 1002

英飞凌TC3xx之一起认识GTM(八)如何使用DTM实现死区时间配置

本文简要介绍英飞凌TC3xx系列芯片的DTM模块结构,以及有哪些相关寄存器可用于实现相关配置。

无所适从的我的博客 4648

Swift与Objective-C运行机制区别

Objective-C中始终先执行完init方法,再调用viewDidLoad方法。 Swift中,convenience init 并没有被认定为是真正的初始化方法,只是一个包含了初始化方法的特殊的普通方法。 情景举例: 初始化一个类,先处理数据,再设置其它控件,通常我们在OC里可以这样写:-(instancetype)initWith:(NSArray*)data{ if(self

a1484的专栏 1205

C#面试题及详细答案120道(61-75)-- 多线程与异步

本文摘要了前后端面试题中关于线程与并发的核心知识点,包括线程与进程的区别(61题)、Thread/ThreadPool/Task的对比(62题)、线程安全实现方法(63题)、lock关键字的原理(64题)、Monitor类的进阶用法(65题)以及死锁的成因与避免(66题)。通过C#代码示例和表格对比,清晰展示了多线程编程的关键概念、应用场景及常见问题解决方案,适合开发者快速掌握面试高频考点。完整内容可访问专栏目录获取更多技术面试题解析。

大剑师兰特的GIS世界 1430

刷爆 Java 基础!1000 道经典面试题精解第一篇【序列化】

自定义序列化 / 反序列化的实现方式在实现接口的类中,手动重写和方法在方法内优先调用执行默认序列化逻辑;追加自定义逻辑(如敏感数据加密、临时字段赋值、兼容旧版本数据等)。// 序列化ID,保证兼容性// 敏感字段,默认不序列化,自定义处理// 自定义序列化// 执行默认序列化:写入username// 自定义逻辑:密码加密后写入// 自定义反序列化// 执行默认反序列化:读取username// 自定义逻辑:读取加密密码并解密// 模拟加密/解密工具方法。

七叔的博客 191

Objective-C 运行时机制详解(区别于C Langauge、C++ Langauge)

Objective-C是动态语言, 一直以来都被Runtime这个东西所迷惑,而恰恰这是一个非常重要的概念。从根本来说,如果要实现一个计算机语言,应该如何考虑呢?这就需要从编译的层次思考前面的问题了。 C、C++、Objective-C实现可以分成3种不同的层次: 第一种是传统的面向过程的语言开发,例如C语言。实现C语言编译器很简单,只要按照语法规则实现一个LALR语法分析器就可以了,编译

aquathinker的专栏 -- AquaMarine Animation 837

保研考研机试攻略(满分篇):第二章——满分之路上(1)

保研考研机试攻略(满分篇):第二章——满分之路上(1)2.1计算机和基础+2.2进阶背包问题+2.3毛毛虫算法

qq_63349644的博客 1195

iOS 开发--Objective-C 反射机制

了解反射机制 Objective-C语言中的OC对象,都继承自NSObject类。这个类为我们提供了一些基础的方法和协议,我们可以直接调用从这个类继承过来方法。当然,本篇文章中讲到的反射方法,就在NSObject和Foundation框架中。 反射机制涉及到的东西比较多,这篇文章只从OC层面来讲反射机制,不涉及runtime部分,以后会写文章来专门讲runtime的。 获取Cla

u011752619的博客 853

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

OC反射机制

NSObject常用方法: ============================================================= OC反射机制:

gcs的博客 304

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

利用Objective-C的反射机制和运行时特性实现类静态方法的动态访问(二)

继上次的研究成果继续深入研究,洒家又完善了下在运行时动态调用所有OC类方法的公用方法: typedef void*(*ObjcMsgSend)(id, SEL, ...); - (void *)invoke:(id)inst method:(NSString *)name,... {     SEL sel = NSSelectorFromString(name);     IMP

liyun_1981的专栏 1927

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

iOS之OC面试题

1、Objective-C反射机制 Objective-C反射机制:是类似于Java的反射机制,这种动态机制可以让oc语言更加的灵活。 oc反射机制有三个用途: 1、获得Class 2、检查继承关系 3、动态的调用方法 获取Class对象 Class对象其实本质上就是一个结构体,这个结构体中的成员变量还是自己, 这种设计方式非常像链表的数据结构。 typedef struct objc_class *Class; struct objc_class { Class ..

u010029439的博客 1040

【深入学习iOS开发(一)】Objective-C Reflection(Objective-C 反射机制)

Objective-C Reflection(Objective-C 反射机制) NSObject 方法 除了个别例外,Cocoa 中大部分类都是 NSObject 的子类,因此大部分对象都继承了它所定义的方法。 NSObject 提供了一些简单的查询运行时系统信息的方法: - (BOOL)isKindOfClass:(Class)aClass Returns a Boolea...

weixin_34186950的博客 201

Objective-C的重要知识点

Objective-C 方法和选择器有何不同?(Difference between method and selector?) selector是一个方法的名字,method是一个组合体,包含了名字和实现. Core Foundation的内存管理 凡是带有Create、Copy、Retain等字眼的函数,创建出来的对象,都需要在最后做一次release比如CFRunLoopOb

操作猛如虎的博客 2704

反射机制

Class对象其实本质上就是一个结构体,这个结构体中的成员变量还是自己,这种设计方式非常像链表的数据结构。

CatStarXcode的博客 338

Objective-C语言的元编程

Objective-C的元编程也可以用于构建自定义脚本语言或DSL(领域特定语言)。通过利用动态方法调用和反射机制,开发者可以为某些复杂的逻辑提供更为简洁的语法。例如,可以通过解析特定格式的字符串来生成相应的方法调用。Objective-C的元编程特性为开发者提供了强大的工具,使得代码的灵活性和可扩展性大大增强。通过运用运行时特性、动态方法调用、反射机制以及其他高级特性,开发者能够创建出更为高效和易维护的软件。

2501_91226742的博客 380

iOS运行时编程(Runtime Programming)和Java的反射机制对比

运行时进行编程,类似Java的反射。运行时编程和Java反射的对比如下:   1.相同点   都可以实现的功能:获取类信息、属性设置获取、类的动态加载(NSClassFromString(@“className”))、方法的动态调用    下面是iOS中涉及到的相关使用方法     类的动态加载:NSClassFromString(@“className”),方法的动态调用:NSSe...

weixin_33755554的博客 221

Reflection反射在iOS下使用Objective-C 具体如何使用

反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。 以下本博主在空闲之余,使用Objective-C写了一个demo https://

VictorZhang 2052

Runtime应用--反射机制

本文介绍了Runtime的反射机制的应用,以及与Codable的区别

2301_79929304的博客 945

李洪强经典面试题49-Objective-C

李洪强经典面试题49-Objective-C 面试笔试都是必考语法知识的。请认真复习和深入研究OC。 Objective-C 方法和选择器有何不同?(Difference between method and selector?) selector是一个方法的名字,method是一个组合体,包含了名字和实现. Core Foundation的内存管理 凡是带有...

aaa1231722的博客 278
上一篇: iOS (页面间传值)协议和代理的使用 protocol delegate
下一篇: APP 上架证书制作需要注意的几点
明理明智
博客等级 码龄15年 7粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值