反射机制

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

猜你喜欢

热点阅读