这就是所谓的OC的反射机制

笔者自语:隐隐约约的记得有次面试的时候面试官问到了:说一下oc的反射机制。我一脸懵逼的样子,什么是oc的反射机制呀,开发过程中听都听说过,怎么说呢?相信你也遇到过类似的境况,恨不得找一个地缝钻进去,我现在只说一句:其实就那个样子,没啥神秘的!


反射机制的基本概念:

找了好久oc的反射机制,只能朦胧的得到一句:跟java的反射机制相似

那么笔者就先贴上java语言的反射机制基本概念:在运行状态下,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法,这种动态获取信息,以及动态调用对象方法的功能叫java语言的反射机制;

那么oc语言的反射机制与之类似是什么样的呢:在oc语言的反射机制跟java反射机制很相似,在oc中所有oc对象都继承NSObject类,这个类为我们提供了基础的方法和协议,我们可以直接调用这个类继承过来的方法,这个对象的基本信息,这大概就是oc语言的反射机制;

现在基本有了反射机制的概念,我们平时开发过程中都怎么利用这种机制呢?

反射机制的运用

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;
复制代码

利用这些判断方法,可以动态的判断一个对象是否有符合一些条件;例如是否是某个类是否是某个类的实例等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值