1: OC反射的定义
OC的反射机制和java的反射机制类似
java中的反射机制概念: 在运行状态下,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法,这种动态获取信息,以及动态调用对象方法的功能叫java语言的反射机制;
那么oc语言的反射机制是什么样的呢: 在oc语言的反射机制跟java反射机制很相似,在oc中所有oc对象都继承NSObject类,这个类为我们提供了基础的方法和协议,我们可以直接调用这个类继承过来的方法, 获取这个对象的基本信息,这大概就是oc语言的反射机制;
2: 反射机制的应用
1:获取Class对象
Class 对象的本质是一个结构体:
typedef struct objc_class *Class;
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
}
在开发的过程中如果我们要判断两个对象是否同属一个类, 这时候, 我们可以调用他们的class方法做比较:
// 在实例方法中通过self调用class实例方法获取类对象
[self class]
// 通过ViewController类直接调用class类方法获取类对象
[ViewController class]
// 在类方法中使用类对象调用class方法获取类对象
+ (Class)classMethod {
return [self class];
}
2.利用反射方法
系统Foundation框架为我们提供了一些方法反射的API,由于oc语言的动态性,这些操作可以发生在运行时的。
// SEL和字符串转换
FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector);
FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);
// Class和字符串转换
FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);
FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString *aClassName);
// Protocol和字符串转换
FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) NS_AVAILABLE(10_5, 2_0);
FOUNDATION_EXPORT Protocol * __nullable NSProtocolFromString(NSString *namestr) NS_AVAILABLE(10_5, 2_0);
我们可以将字符串与同名的oc对象动态的相互转化;
3:常用判断方法
在NSObject类中我们提供一些基础方法,用来做一些判断操作,这些方法都是发生在运行时动态判断的。利用这些判断方法,可以动态的判断一个对象是否有符合一些条件;例如是否是某个类是否是某个类的实例等。
// 当前对象是否这个类或其子类的实例
- (BOOL)isKindOfClass:(Class)aClass;
// 当前对象是否是这个类的实例
- (BOOL)isMemberOfClass:(Class)aClass;
// 当前对象是否遵守这个协议
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
// 当前对象是否实现这个方法
- (BOOL)respondsToSelector:(SEL)aSelector;