反射是指程序在运行时可以访问、检测和修改程序本身的状态或行为的一种能力,OC是基于Runtime运行时系统的动态语言,具有强大的反射能力。OC的反射机制通常是指NSFoundation中为反射功能提供的一系列API,它们是基于Runtime的封装,是Runtime编程的子集。
1. 获取对象类型
NSFoundation的根类NSObject中实现了-class
方法,默认情况下它返回的是isa
指向的类,但它可以被子类重写(比如KVO中),造成此方法返回的类和isa
指向的类不一致的情况;Runtime提供了Class object_getClass(id obj)
函数来获取对象所属的类,此函数直接返回对象isa
所指向的类;NSFoundation中还提供了类方法+class
,该方法返回的就是当前类,而不是类的类(元类)。
2. 对象检测方法
NSFoundation中根类NSObject实现了一系列方法,来对对象的类型、协议、方法等做检测判断:
1 | // @protocol NSObject |
3.消息派发
NSFoundation中根类NSObject实现一系列Perform Selector,它们有的是对objc_msgSend
的封装,有的则是基于线程的RunLoop来实现的:
1 | // @protocol NSObject |
Perform Selector中有返回值的API要注意返回的对象可能会内存泄露,进行延迟派发、派发给其他线程、以及当前线程异步派发时,要注意判断目标线程的RunLoop是否运行。
4. 反射方法
NSFoundation中还提供了字符串和Selector、类、协议互相装换的API,以方便放射功能的使用:
1 | NSString *NSStringFromSelector(SEL aSelector); |