反射机制
iOS反射机制:运行时选择创建哪个实例,并动态选择调用哪个方法。
获取Class的三种方法
// 通过字符串获取class
Class class = NSClassFromString(@"NSString");
NSLog(@"class type : %@", class);
// 直接用class 来创建对象 ,通过对象来获取class
id str = [[class alloc] init];
NSLog(@"%@", [str class]);
// 通过类来获取class
NSLog(@"%d", class==NSString.class);
常用判断方法
// 当前对象是否这个类或其子类的实例
- (BOOL)isKindOfClass:(Class)aClass;
// 当前对象是否是这个类的实例
- (BOOL)isMemberOfClass:(Class)aClass;
// 当前对象是否遵守这个协议
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
// 当前对象是否实现这个方法
- (BOOL)respondsToSelector:(SEL)aSelector;
- OC中使用反射的优点
松耦合,类与类之间不需要太多依赖
构建灵活
- OC中使用反射的缺点
不利于维护。使用反射模糊了程序内部实际发生的事情,隐藏了程序的逻辑。这种绕过源码的方式比直接代码更为复杂,增加了维护成本。
性能较差。使用反射匹配字符串间接命中内存比直接命中内存的方式要慢。当然,这个程度取决于使用场景,如果只是作为程序中很少涉及的部分,这个性能上的影响可以忽略不计。但是,如果在性能很关键的应用核心逻辑中使用反射,性能问题就尤其重要了
应用场景:
1、路由模式情况下的页面跳转。
2、FMDB二次数据库封装。