iOS开发之笔记摘录

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];
}
上一篇 下一篇

猜你喜欢

热点阅读