运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能就是反射机制.
动态的运行状态下我们可以构造任意一个类,然后我们通过这个类知道这个类的所有属性和方法,并且如果我们创建一个对象,我们也可以通过对象找到这个类的任意一个方法,这就是反射机制
(大部分的动态反射支持来自NSObject 类。NSObject是所有类(除了一些很少见的例外)的根类。所以基本常用到的类应该都可以支持反射)
获得class
通过类名的字符串形式实例化对象(这里我拿在项目当中创建的person类进行实验,下面方式属于C语言方法)
Class class="NSClassFormString"(@"person");
person *tea=[[class alloc] init];
通过类名来生成相应类的实例
NSString *str = NSStringFormClass(class);
Class * tempClass = NSClassFromString(str);
这里 在创建这个类实例之前 最好判断下 是否该对象存在;
if(!tempClass) return;
// 如果存在 就创建你相应的实例对象 比如上面我们这个类名 是UIViewController子类的类名 UIViewController * tempObj = [[tempClass alloc] init];
方法的优势:
1、代码更安全,程序在编译阶段就可以检测需要访问的Class对象是否存在
2、程序性能高,因为这个方式无须调用方法。
检查继承关系
如果程序只是需要确认一个类的继承关系,可以直接调用NSObject提供的方式来进行判断。
1、isKindOfClass:需要传入一个Class参数,用于判断该对象是否为该类及其子类的实例
2、isMemberOfClass:需要传入一个Class参数,用于判断该对象是否为该类的实例
3、conformsToProtocol:需要传入一个Protocol参数,用于判断该对象是否为该类及其子类的实例(该方法中需要传入一个Protocol参数,在程序中有两种方法可以获得:①oc提供的@protocol指令来实现;②调用Protocol *NSProtocolFromString(NSString *namestr);方法根据协议名字符串来获取对应的协议)
作
网友评论