OC的反射机制

目录
  • 1 反射机制的概念
  • 2 反射机制原理
首先还是按照惯例和大家解释下什么反射机制?

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射机制的语言。

当然反射机制的提出在java中的概念是这样的-

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

所以当然反射机制在oc中的使用状态也是一样的,那么它在OC语言当中能够实现哪些功能呢?

动态的运行状态下我们可以构造任意一个类,然后我们通过这个类知道这个类的所有属性和方法,并且如果我们创建一个对象,我们也可以通过对象找到这个类的任意一个方法,这就是反射机制

为了显示反射机制的内容,我们可以直接用一个实例对象或类对象,直接调用Class方法,都可以获取Class对象。我们调用下面三个方法,都可以获得Class对象。

  • 1 在实例方法中通过self调用class实例方法获取类对象
[self class]
  • 2 通过ViewController类直接调用class类方法获取类对象
[ViewController class]
  • 3 在类方法中使用类对象调用class方法获取类对象
 + (Class)classMethod {
    return [self class];
}

上面的三种形式我们都在控制台进行输出,输出的结果如下

都是访问当前VC下面class的地址

通过打印,我们发现调用这三个方法,获取到的类对象是同一个类对象,内存地址也是一样的。
这是因为这三个方法调用class方法,打印的都是类对象的isa指针。

NSLog(@"%p, %p, %p", [ViewController classMethod], [ViewController class], [self class]);
打印结果:0x10fc68fd8, 0x10fc68fd8, 0x10fc68fd8

  • 4 这个时候我又将其中的一个换成了[person class] 我想看看地址是否会更改,当然答案也是肯定的!
输出截图

NSLog(@"%p, %p, %p", [ViewController classMethod], [ViewController class], [self class]);
打印结果:0x10fc68fd8 , 0x10fc68fd8 , 0x10fc690a0

  那么上面说的这个isa又是什么呢?这个我们又要往深说了。
  • 在Objective-C中,任何类的定义都是对象。类和类的实例(对象)没有任何本质上的区别。任何对象都有isa指针,对于oc指针我也进行了实验,图片如下。


    isa指针
  • 输出结果如下


    person 类下面的全部属性

所以说通过上面runtime的方式可以通过指针输出你想要的类当中的的全部属性,当然反过来也是可以实现的(这里对runtime不做过多的讲解,改天更新文章再对runtime进行分享)

下面我们说下几种常见的转换方式(大部分的动态反射支持来自NSObject 类。NSObject是所有类(除了一些很少见的例外)的根类。所以基本常用到的类应该都可以支持反射)
  • 通过类名的字符串形式实例化对象(这里我拿在项目当中创建的person类进行实验,下面方式属于C语言方法)
 Class class="NSClassFormString"(@"person");
           person *tea=[[class alloc] init];
  • 通过类名来生成相应类的实例
  NSString *str=NSStringFormClass(class);
  Class * tempClass =  NSClassFromString(str);
这里 在创建这个类实例之前 最好判断下 是否该对象存在;
if(!tempClass) return;
// 如果存在 就创建你相应的实例对象 比如上面我们这个类名 是UIViewController子类的类名
UIViewController * tempObj = [[tempClass alloc] init];
  • 以上两种情况截图如下


    通过类名的字符串形式实例化对象 类名转换成字符串
当然反射机制还可以做到下面的两种状态-
  • 方法反射之 通过方法名的字符串形式实例化对象
SEL selector=NSSelectorFormString(@"Test");
 [person  performSelector:selector)];

图片如下-


通过方法名的字符串形式实例化对象
通过方法名的字符串形式实例化对象
  • 方法反射之 反射成字符串输出
  NSString * str =   NSStringFormSelector(selector);

以上四种方式就是反射机制常用到的四种形式

本人个人微信公众号地址(喜欢记得关注😯)


辛小二个人微信公众号地址
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 学习Android的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Android学习交流群...
    kingZXY2009阅读 329评论 0 0
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,670评论 0 9
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,607评论 0 11
  • 想说这个是因为在看了两节《川普上任需要解决的十个问题》的课程之后。 先说看到课程题目的感受,没见过中国哪个大学会有...
    洗粉小能手阅读 405评论 2 0