Object-c反射机制

Object——C提供了三种方式实现与运行环境的交互

直接使用Object-c的源代码实现。这是最常见的方式,开发者只需要编写Object-c的源代码,运行环境负责在后台工作,当编译时,编译器会创建大量数据结构和实现动态机制的函数,其中数据结构负责保存类、类别和等一的数据,函数负责数据处理的调用

通过NSObject类中定义的方法进行动态编程,因此绝大部分的分类都是NSObject的子类,故所有的对象都可以直接调用NSObject的方法进行编程,在少数情况下,NSObject类只提供了方法模板,并没有为方法的实现提供代码。

直接调用运行时函数进行动态编程,运行时系统是一个动态共享库,其由一系列位于/user/include/objc目录的头文件中的函数和数据结构组成。


获取Class

每个类都对应一个class,该class的获取方式如下:

使用ClassNSClassFromString(NSString* aClassName)函数来获取Class,该函数需要传入字符串参数,该字符串的参数是某个类的类名。

调用某个类的class方法来获取当前的class,比如[User class];

调用某个对象的 class方法来获取,该方法时NSObject中实例方法,所有的NSObject对象都可以调用该方法。

实例-------

Class clazz=NSClassFromString(@"NSDate");

该class对应NSDate,该clazz==NSDate.class;

id date=[[clazz alloc] init];

该date对应当前的事件2016-05-16 09:14:11 +0000

该[date class]输出为—  _NSDate

通过类名字符串、类本身回去的Class对象时对等的,但是通过NSDate对象获取的Class则是_NSDate。造成这样问题的原因是:Objective-C很多设计都采用类簇的设计,NSDate只是该类簇的前缀,当程序调用[[NSDate] alloc]init]创建对象时,程序事件返回的是NSDate的子类_NSDate的实例而不是NSDate的实例,因此,程序直接调用date对象的class方法来获取Class时获取到的是_NSDate;

一旦获得到某个类对应的Class后,程序可以直接调用该Class的alloc方法来创建对象,后调用init方法执行初始化即可,从程序的运行结果可以看到,调用Class的alloc方法创建的并不是class的实例,而是该Class对应的类的实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值