概述
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对应的类的实例。
最后
以上就是活力夕阳为你收集整理的Object-c反射机制的全部内容,希望文章能够帮你解决Object-c反射机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复