反射机制
2017-06-15 本文已影响9人
Eugene_iOS
前言
因为Objective C是动态语言,我们可以根据这个特性做一些实例创建
、动态方法调用
、条件判断
的操作。
常用方法反射的API
// 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);
运行时判断对象类型的方法
// 当前对象是否这个类或其子类的实例
- (BOOL)isKindOfClass:(Class)aClass;
// 当前对象是否是这个类的实例
- (BOOL)isMemberOfClass:(Class)aClass;
// 当前对象是否遵守这个协议
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
// 当前对象是否实现这个方法
- (BOOL)respondsToSelector:(SEL)aSelector;
使用
//根据字符串 运行时 创建实例对象
Class class = NSClassFromString(@"HomeViewController");
HomeViewController *vc = [[class alloc] init];
//根据字符串动态的进行方法调用
SEL selector = NSSelectorFromString(@"setupNavBar");
[vc performSelector:selector];
//运行时动态判断当前对象是否是UIView对象或其子类
if ([self isKindOfClass:NSClassFromString(@"UIView")]) {
NSLog(@"The Current Class is UIView Class");
}
或
if ([self isKindOfClass:[UIView class]]) {
NSLog(@"The Current Class is UIView Class");
}