iOS之反射机制(内省机制)
2019-08-16 本文已影响0人
平安喜乐698
目录
内省(反射)机制是面向对象语言的一个强大特性 , 检查对象自己在运行时的信息(在继承树上的位置,是否遵循特定的协议,是否可以响应特定的消息)来避免出现未识别方法等问题。
检查类
+ (Class)class; // 返回本类类型
+ (Class)superclass; // 返回父类类型
+ (BOOL)isSubclassOfClass:(Class)aClass; // 是否是某类型的子类
- (BOOL)isKindOfClass:(Class)aClass; // 是否是某一种类
- (BOOL)isMemberOfClass:(Class)aClass; // 是否是某一成员类
检查协议
// 是否实现了某协议
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
// [personVC conformsToProtocol:@protocol(UITableViewDelegate)]
检查方法
// 是否实现了某方法
- (BOOL)respondsToSelector:(SEL)aSelector;
NSString->SEL、Class、Protocol 通过字符串来生成对应的类、方法、协议,来达到减少冗余(减少if判断、减少相同代码等)优化代码风格的目的。
// SEL<->NSString
FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector);
FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);
// Class<->NSString
FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);
FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString *aClassName);
// Protocol<->NSString
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);
例子
- (void)remoteNotiDictionary:(NSDictionary *)dict {
// 生成不同的VC
Class class = NSClassFromString(dict[@"className"]);
UIViewController *vc = [[class alloc] init];
// 传入参数
NSDictionary *parameter = dict[@"propertyArr"];
[parameter enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
if ([vc respondsToSelector:NSSelectorFromString(key)]) {
[vc setValue:obj forKey:key];
}
}];
/*
// 调用方法
SEL selector = NSSelectorFromString(dict[@"methodName"]);
[vc performSelector:selector];
*/
[self.navigationController pushViewController:vc animated:YES];
}