概念
反射机制是指程序可以访问、检测和修改它本身状态或行为的一种能力。在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方便很多。
网友评论