OC 的反射机制

一 定义概念

普遍的概念就是类似于java的反射机制,动态机制使得OC语言更加灵活。

反射机制就是可以根据指定的类名获取类的相关信息。

二 作用

1 根据类名获得class

//  选择器 和字符串之间的相互转化
FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector);
FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);// 类 和 字符串相互之间的转化
FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);
FOUNDATION_EXPORT Class _Nullable NSClassFromString(NSString *aClassName);// 协议和字符串之间相互的转化
FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
FOUNDATION_EXPORT Protocol * _Nullable NSProtocolFromString(NSString *namestr) API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
    // 创建类的方法大致分为下面的三种Class cls1 = NSClassFromString(@"NSData");NSData * data = [[NSData alloc]init];Class cls3 = [NSData class];

2 检查继承的关系

 NSString *str = [[NSString alloc]init];// 判断当前的类是否为此类的对象[str isMemberOfClass:[NSString class]];// 判断是否为某一个类或者子类的对象[str isKindOfClass:[NSString class]];// 判断对视是否实现了指定的协议[str conformsToProtocol:@protocol(NSCopying)];// 是否实现对应的方法[str respondsToSelector:@selector(printAction)];

三 使用场景

简单来讲 就是根据后台推送过来的数据,跳转指定的页面的场景使用

假设后台的数据是下面的格式
@{// 类名@"className" : @"UserListViewController", // 数据参数@"propertys" : @{ @"name": @"liuxiaozhuang", @"age": @3 },// 调用方法名@"method" : @"refreshUserInformation"};定义一个UserListViewController类,这个类用于测试,在实际使用中可能会有多个这样的控制器类。#import <UIKit/UIKit.h>
// 由于使用的KVC赋值,如果不想把这两个属性暴露出来,把这两个属性写在.m文件也可以
@interface UserListViewController : UIViewController
@property (nonatomic,strong) NSString *name;/*!< 用户名 */
@property (nonatomic,strong) NSNumber *age;/*!< 用户年龄 */
/** 使用反射机制反射为SEL后,调用的方法 */
- (void)refreshUserInformation;
@end- (void)remoteNotificationDictionary:(NSDictionary *)dict {// 根据字典字段反射出我们想要的类,并初始化控制器Class class = NSClassFromString(dict[@"className"]);UIViewController *vc = [[class alloc] init];// 获取参数列表,使用枚举的方式,对控制器属性进行KVC赋值NSDictionary *parameter = dict[@"propertys"];[parameter enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {// 在属性赋值时,做容错处理,防止因为后台数据导致的异常if ([vc respondsToSelector:NSSelectorFromString(key)]) {[vc setValue:obj forKey:key];}}];[self.navigationController pushViewController:vc animated:YES];// 从字典中获取方法名,并调用对应的方法SEL selector = NSSelectorFromString(dict[@"method"]);[vc performSelector:selector];
}

OC 的反射机制以及使用场景相关推荐

  1. Java反射机制的适用场景及其利与弊 ***

    一.反射的适用场景是什么? 1).Java的反射机制在做基础框架的时候非常有用,有一句话这么说来着:反射机制是很多Java框架的基石.而一般应用层面很少用,不过这种东西,现在很多开源框架基本都已经给你 ...

  2. 反射机制及其应用场景

    反射----1 反射机制 反射的应用场景 Tomcat服务器 1.   Java的反射机制 (1).反射和类的关系 在程序运行状态中,对任意一个类(指的是.class文件),都能够知道这个类的所有的属 ...

  3. Java基础学习总结(75)——Java反射机制及应用场景

    什么是Java反射机制? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的以及动态调用对象的方法的功能称为 ...

  4. 简述 Java 的反射机制及其应用场景

    1.前言 反射(Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序对自身进行检查,并能直接操作程序的内部属性和方法. 反射是所有注解的实现原理,尤其在框架设计中. 常见的 ...

  5. Python中的反射机制(reflect)

    1.区别标识名与看起来相同的字符串 标识名和看起来相同的字符串,两者在字面上看起来一样,却是两种东西,例如下面的例子中func函数和字符串"func" def func():pri ...

  6. Objective-C Reflection(Objective-C 反射机制)实用随笔笔记(持续更新)

    前言:本篇文章就"Objective-C 反射机制"使用方面进行叙述,不会涉及太多理论论述,因为"Objective-C 反射机制"理论论述在网上搜索一大把,本 ...

  7. Effective Java之接口优先于反射机制(五十三)

    核心反射机制java.lang.reflect提供了"通过程序来访问关于已装载的类的信息"的能力,给定一个Class实例,可以获得Constructor.Method.Field实 ...

  8. 反射获取list泛型_Android 从浅到懂使用反射机制

    定义 Java 反射机制是发生在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法:对于任何一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为 Java ...

  9. java 反射机制_基础篇:深入解析JAVA反射机制

    反射的概念 java 的放射机制:在程序运行时,程序有能力获取一个类的所有方法和属性:并且对于任意一个对象,可以调用它的任意方法或者获取其属性 通俗解析:java 文件需要编译成. class 文件才 ...

最新文章

  1. Appium的Java封装
  2. 网络工程师应该掌握的50个路由器知识要点
  3. NGINX(一)内存结构
  4. 近世代数--置换群--判断置换的奇偶性
  5. Key usage extensions and extended key usage
  6. Qt 操作words实例 --- 幼儿快算题生成器
  7. 曲线运动与万有引力公式_高考物理曲线运动万有引力专题讲解
  8. 刘歧:FFmpeg Filter深度应用
  9. 人工智能应用,德国AI公司
  10. [leetcode]84. Largest Rectangle in Histogram c语言
  11. 启动时间知多少?8款音视频类应用测评报告分析
  12. Python学习笔记整理总结【Django】Ajax
  13. 人月神话札记:画蛇添足
  14. 腾达ac5第三方固件_腾达AC9的刷固件指南
  15. 1124 Raffle for Weibo Followers(map)
  16. ③电子产品拆解分析-充电宝台灯
  17. 从三字经看古代幼儿教育
  18. Ubuntu顶栏显示网速和硬件信息
  19. Genero BDL错误
  20. 关于电子产品克隆,PCB抄板与芯片解密缺一不可!

热门文章

  1. [python]关于字符串查找和re正则表达式的效率对比
  2. instanceof, isinstance,isAssignableFrom的区别
  3. Minimum Path Sum
  4. java.utilDate和java.sql.Date
  5. Jquery实现的Tabs页签
  6. 【转帖】如何通过 javascript 访问 GridView/DataGrid 选中 CheckBox 行各列的值
  7. Squid3反向代理安装与配置
  8. 使用多线程还是用IO复用select/epoll? epoll 或者 kqueue 的原理是什么?
  9. Python3中PyMongo使用举例
  10. 回调函数在C/C++中的使用