OC 内省(反射)机制的理解

本文介绍了Objective-C中的反射机制,基于Runtime实现,包括字符串与Class、方法、属性的转换。通过反射,可以在运行时动态获取类、方法、属性,实现动态创建对象、调用方法、赋值等。文中详细阐述了如何进行字符串与Class的转换、内部方法的判断以及KVC实现的属性转换,并提供了反射机制的实用技巧和示例。
摘要由CSDN通过智能技术生成

Objective-C 中基于RunTime实现的反射


一、反射


反射,一般表现在字符串和Class转换,字符串和内部方法转换,字符串和属性的转换(取值和赋值)。


二、Objective-C中的反射


OC的反射是基于其Runtime实现的


以执行某个函数为例,我们知道在OC中执行[pyPerson doSomething]函数,实质上是发送了一个消息给Runtime,然后Runtime再根据这个Class的字符串名和这个函数的字符串名,去匹配真正相应的方法的地址,然后再执行的。所以中间我们可以利用字符串去动态的检测,甚至动态的修改(之前说到的Method Swizzling)。 

 

理解反射机制是指方法名、类名、属性名等可以和字符串相互转化(反射),而这些转化是发生在运行时的,所以我们可以用这个机制来动态的获取类、方法或属性,从而动态的创建类对象、调用方法、或给属性赋值、判断类型等。

 

获取Class对象

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

typedef struct objc_class *Class;
struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;                                  
}

直接用一个实例对象或类对象,直接调用Class方法,都可以获取Class对象。我们调用下面三个方法,都可以获得Class对象。

// 在实例方法中通过self调用class实例方法获取类对象
[self class]
// 通过ViewController类直接调用class类方法获取类对象
[ViewController class]
// 在类方法中使用类对象调用class方法获取类对象
+ (Class)classMethod {
    return [self class];
}

我们发现调用这三个方法,获取到的类对象是同一个类对象,内存地址也是一样的:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值