您的当前位置:首页正文

OC的反射机制

来源:要发发知识网

概念

反射机制是指程序可以访问、检测和修改它本身状态或行为的一种能力。在OC中是可以去动态访问,检查,修改的方法就是反射机制的一种体现,其实我们一种都在使用反射机制来做项目,可能自己还不知道

反射方法

访问获取

// SEL获取字符串
FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector);
// 字符串获取SEL
FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);
// Class获取字符串
FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);
// 字符串获取Class
FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString *aClassName);
// Protocol获取字符串
FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) NS_AVAILABLE(10_5, 2_0);
// 字符串获取Protocol
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;

检查是否存在某个类

if ([view isKindOfClass:[SWAlertView class]] || [NSStringFromClass([view class]) isEqualToString:@"SWCouseFinishAlertView"]) {
            _isHaveAlert = YES;
}

具体应用

一般是根据服务器的数据动态的打开某个页面,用在轮播图或者服务器推送的通知上。和服务器约定数据格式

@{
     // 类名
     @"class" : @"SWTrainViewController", 
     // 数据参数
     @"data" : @{ @"id": @"11323"}
}

我们可以去动态的获取类,传值和跳转

- (void)remoteNotificationPushViewController:(NSDictionary *)dic {
    // 字符串初始化控制器
    UIViewController *viewController = [[NSClassFromString(dic[@"class"]) alloc] init];
    // 获取参数列表,使用枚举的方式,对控制器属性进行KVC赋值
    NSDictionary *body = dic[@"data"];
    [body enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
         // 赋值
        [viewController setValue:obj forKey:key];
    }];
    [self.navigationController pushViewController:viewController animated:YES];
}

这里传值是直接的属性传值,在项目中其中一个控制器我传了model过去,会导致这样的属性传值失败,所以尽量在需要跳转的地方不要写model传值,可能开发过程中传model方便很多。