版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、iOS开发探讨-Runtime原明白得读及实践咱们第一次接触runtime,听起来老是那么神秘高级,各类论坛对runtime介 绍数不胜数。笔者今天对高大上的runtime进行简单的梳理,如有不足,欢迎列 位大神吐槽。一、大体概念runtime是一套比较底层的纯C语言API,属于1个C语言库,包括了很多 底层的C语言API。在咱们平常编写的0C代码中,程序运行进程时,其实最终 都是转成了 runtime的C语言代码,runtime算是0C的幕后工作者。RunTime简称运行时确实是系统在运行的时候的一些机制,其中最要紧的 是消息机制。关于C语言,函数的挪用在编译的时候会决定挪用哪个函数,编译完
2、成以后 直接顺序执行,无任何二义性。0C的函数挪用成为消息发送。属于动态挪用进程。在编译的时候并非能决 定真正挪用哪个函数(事实证明,在编译时期,0C能够挪用任何函数,即便那 个函数并未实现,只要申明过就可不能报错。而C语言在编译时期就会报错)。只有在真正运行的时候才会依照函数的名称找到对应的函数来挪用。二、大体结构及其继承关系要谈runtime笫一必然要先了解和类的结构,这超级有助与咱们明白得其动 态性。第一咱们打开。句c/。6c.文件,能够看到如下概念:itif !OBJC_TYPES_DEFINED/ An opaque type that represents an Objective
3、-C class, typedef struct objc_class *Class;/ Represents an instance of aclass, struct objc_object Class isa OBJCSA_AVAILABILITY; ;/ A pointer to an instance of a class, typedef struct objc_object *id;#endif通过上面概念咱们能够看出以下几点:咱们经常使用的id类型事实上一个指向objjobject结构体的指针,id通常 指代一个对象,也确实是说0C对象其实就一个指向objjobject结构体的
4、指针咱们看objc_object结构体概念,得知其结构体内有一个类型为Class的字段 isa,这确实是咱彳常说的isa指针了。再来看Class的声明,为一个指向objc_class的指针,事实上isa确实是指明当前结构体所属类型,咱们能够明白得为obj jobject 为Class类型的接下来咱们继续打开,来看objjclass声明Struct obj c_class Class isa 0BJC_Isa_AVAILABILITY; ttif !_0BJC2_Class super_class const char *name long version 息,默以为0long info运行期利
5、用的一些位标识 long instance_size例变量大小一Struct objc_ivar_list *ivars 员变量链表objc2_unAVAILABLE;/ 父类objc2_unAVAILABLE;/ 类名 objc2_unAVAILABLE;/ 类的版本信objc2_unAVAILABLE;/ 类信息,供objc2_unAVAILABLE;/ 该类的实objc2_unAVAILABLE;/ 该类的成Struct obj c_method_list; * *methodLists OBJC2_UnAVAILABLE; / 该类的 成员变量链表一 一一Struct objc-cac
6、he cacheOBJC2_UNAVAILABLE; / 该类的成员变量链表一一Struct obj c_protocol_list *protocolsOBJC2_UnAVAILABLE; / 该类的成员变量链表#endif objc2_unAVAILABLE;下面说一下咱们感爱好的几个字段:isa:那个地址的isa指针一样是一个指向objjclass的指针,说明该Class的 类型,那个地址的isa指针指向的确实是咱们常说的meta-class 了。不难看出,类本身也是一个对象superclass:那个指针确实是指向该class的super class,即指向父类,若是 该类已是最顶层的根
7、类(如NSObject或NSProxy),那么superclass为NULL。cache:用于缓存最近利用的方式。一个接收者对象接收到一个消息时,它 会依照isa指针去查找能够响应那个消息的对象。在实际利用中,那个对象只有一部份方式是经常使用的,很多方式其实很少 用或全然用不上。这种情形下,若是每次消息来时,咱们都是methodLists中遍历一遍,性能 必将很差。这时,cache就派上用处了。在咱们每次挪用过一个方式后,那个方式就会被缓存到cache列表中,下次 挪用的时候runtime就会优先去cache中查找,若是cache没有,才去methodLists 中查找方式。如此,关于那些常经
8、常使用到的方式的挪用,但提高了挪用的效率。version:咱们能够利用那个字段来提供类的版本信息。这关于对象的序列化 超级有效,它可是让咱们识别出不同类概念版本中实例变量布局的改变。objc_methodjist:方式链表中寄存的是该类的成员方式(-方式),类方式(+方 式)存在 meta-class 的 objc_method_list 链表中。以下通过图来描述相应的继承关系:superclass:isaInstance ofRoot classInstance ofSuperclassInstance QfSubclassmMFF7 心.pQ注意:所有metaclass中isa指针都指向跟
9、metaclass,而跟metaclass那么指向自身。Root metaclass是通过继承Root class产生的,与root class结构体成员一致, 也确实是前面提到的结构。不同的是Root metaclass的isa指针指向自身。root class 的 super class 指向的是 niL现在咱们再来明白得一下当你挪用respondsToSelector:如此的方式的时候,实例对象只需要依照其isa指针,找到其所属的class, 然后遍历其methodListSo若是没有,那么依照那个类的superclass找到其父类,再看其父类是不是 能相应那个方式就能够够了。直到sup
10、erclass为nil时,就无法相应那个方式了,return NOo同理,当咱们利用类名挪用类方式(+方式)时,只需要依照class的isa指针, 找到其meta-class,然后通过meta-class的methodLists找到相应的方式既可。三、常见的作用1 .动态的添加对象的成员变量和方式,修改属性值和方式2 .动态互换两个方式的实现3 .实现分类也能够添加属性4 .实现NSCoding的自动归档和解档5 .实现字典转模型的自动转换6 .动态创建一个类(比如KVO的底层实现)OC的方式挪用在Runtime中具体的实现1.0C代码挪用方式Receiver *receiver = (Rec
11、eiver alloc init;receiver message;2.在编译时RunTime会将上述代码转化成发送消息objc_msgSend(receiver,selector(message);四、编写代码实现通过创建Student类来例如:ttimport ttimport ©interface Student :NSObjectproperty(nonatomic,copy)NSString *name;-(Void)eat;-(void)sleep;©endStudent.m实现文件iiimport "Student. h ©implemen
12、tation Student - (void) eat NSLog(H 饭了,self, name) ; - (void) sleep NSLog("%睡觉了”, self, name) ; end1 .动态变量操纵- (void)changevariable Student *student = Student new;student. name = 乔布斯;NSLog( % z student .name);unsigned int count;Ivar *ivar = class_copylvarList(student class/ &count);for (int
13、i = 0; i< count; i+) Ivar var = ivari;Const char *varName = ivar_getName(var);NSString *name = NSString stringwithcstring:varNameencoding:NSUTF8StringEncoding;if (name isEqualToString: _name ) obj ect_setlvar (student, var, Steve Jobs ); break; NSLog( % z student .name); 输出结果:2016-02-22 11:06:00.
14、153 Day2016-02-049296:1003059乔布斯 2016-02-2211:06:03.155 Day2016-02-049296:1003059 Steve Jobs2 .动态添加方式Void happyNewYear(id Self, SEL _omd)NSLog (矿新年欢乐);一注意:l.void的前面没有+、-号,因为只是C的代码。2,必需有两个指定参数(id self,SEL.cmd)-(void)addMethod Student *student = Student new;student. name = 乔布斯;class_addMethod ( studen
15、t class , selector (join) , (IMP) happyNev/Year, V:);student performSelector:selector(join);参数说明:(IMP)happyNewYear 意思是 happyNewYear 的地址指针;"v:"意思是,v代表无返回值void,若是是i那么代表int;代表id sei;:代 表 SEL_cmd;v:意思是,两个参数的没有返回值。输出结果2016-02-22 11:10:06.379 Day2016-02-049296:1003059新年欢乐3.动态为Category扩展加属性XCode运
16、行你在Category的.h文件申编译通过,但运行时若 是没有Runtime处置,进行赋值取值,就马上报错。第一添加分类 Student+CategoryStudent+Category.h 文件#import "Student. h,zinterface Student(Category)©property(nonatomic,copy)NSString *firstName;endStudent+Category.m 文件#import 'Student+Category.h' #import ©implementation Student (
17、Category) const char name; 一 (void)setFirstName:(NSString *)firstName objc_setAssociatedObject(self, &name, firstName, OBJC_ASSOCIATION_COPY_NONATOMIC); -(NSString *)firstName return objc-getAssociatedObject(self, &name); ©end挪用实现- (void)addExtentionProperty Student *student = Student n
18、ew;student.firstName = Q Steve ;NSLog ( 添加属性 first'ame 结果:9i> , student. f irstName); 输出结果:2016-02-22 11:21:58.765 Day2016-02-049354:1010756添力口属'性 firstName 结果:Steve4.动态互换方式实现-(void)exchangeMethod Student *student = Student new;student. name = 乔布斯;student eat;student sleep;NSLog (”互换方式实现);Method ml = class_getInstanceMethod(student class, ©selector (eat);Method m2 = class_ge,tInstanceMe,thod ( student claSS-, ©selector(sleep);method_exchangeImplementations(ml, m2);student eat;student sleep; 输出结果:2016-02-22 11:30:10.068
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2021高考生物限时规范特训:第22讲-染色体变异
- 《脊柱整脊方法》课件
- 【1对1】2021年高中数学学业水平考试专题综合检测-模拟试卷(八)
- 2021高考英语一轮课下限时训练及答案(人教新课标必修3Unit-5)
- 安徽省合肥市蜀山区2024-2025学年七年级期末质量检测语文试卷(含答案)
- 2024-2025学年山东省烟台市蓬莱区八年级(上)期末英语试卷(五四学制)(含答案)
- 第二单元 焕发青春活力学情评估(含答案) 2024-2025学年统编版七年级道德与法治下册
- 【全程复习方略】2020年人教A版数学理(广东用)课时作业:第八章-第二节直线的交点坐标与距离公式
- 《儿化发音》课件
- 2021年高考语文考点总动员考向26-点号使用(解析版)
- 腹部外伤门诊病历
- 品质异常处理及要求培训
- 模具部年终总结--ppt课件
- 立式热虹吸再沸器机械设计说明书
- 国家开放大学电大《生产与运作管理》2025-2026期末试题及答案
- 质量保证大纲(共14页)
- 关于欧盟新版EMC标准EN55032的解析
- 木材材积表0.1-10米.xls
- 轻质隔墙板安装合同协议书范本标准版
- 车辆管理各岗位绩效考核量表
- 挺身式跳远单元教学计划
评论
0/150
提交评论