我是靠谱客的博主 活力夕阳,最近开发中收集的这篇文章主要介绍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对应的类的实例。

最后

以上就是活力夕阳为你收集整理的Object-c反射机制的全部内容,希望文章能够帮你解决Object-c反射机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部