美文网首页
反射机制

反射机制

作者: Eugene_iOS | 来源:发表于2017-06-15 11:36 被阅读9次

    前言

    因为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");
       }

    相关文章

      网友评论

          本文标题:反射机制

          本文链接:https://www.haomeiwen.com/subject/kxpyqxtx.html