对RunTime的一点认识

RunTime简称运行时,是运行时的一些机制,最主要的是消息机制。因为oc中只有对象能发送消息,所以一般以objc开头。

对于c语言,函数在编译是就会决定调用,而oc中不会,oc的函数属于一种动态调用。举例说明,oc中只声明一个方法并不去实现它,然后直接调用,编译夺得时候不会报错,只有在运行时报错。类似的情况,在c中是不能通过编译的。

简单归纳一下RunTime的功能:发送消息,交换方法的实现,动态添加方法,给分类添加属性以及字典转模型。

使用消息机制的前提是头文件导入#import <objc/runtime.h>(有些人喜欢用<objc/message.h>后者内部导入了前者)

发送消息:objc_msgSend(类或者对象 @selector(方法名));比较简单,与普通的oc基本一样。

交换方法:当系统自带的方法功能不够,需要给系统的类添加方法,并保持原有的功能。

第一种方法:继承系统的类,重写系统的方法,实现功能后再导入该文件。然后调用方法。

第二种方法:runtime方法,创建一个分类,在分类中实现一个方法,使用runtime交换该方法与原方法的实现。(不能在分类中重写系统的方法否则会覆盖系统的原方法,也不能在分类中调用super);

动态添加方法: 关键字performSelector  关健方法:+(BOOL)resolveInstanceMethod:(SEL)sel

当对象调用没有实现的方法,就会进入该方法,并且会把对应的方法列表传过来。

介绍一下方法列表:methodList 对象方法保存在类中,类方法保存在元类(meta class)中。

方法的查找:根据对象的isa去对应的类中查找,根据方法的编号SEL,在方法列表中找到对应方法名,再根据方法名找到实现。

由此我们可以在该方法中判断一下没有实现的方法是不是我们想添加导入方法如果是,再使用class_addMethod方法添加一个方法,然后实现这个方法即可,最后还要return [super resolveInstanceMethod:sel];保持系统原有的做法。

给分类添加属性:都知道,分类是不能生成属性和成员变量的,只能给原类扩充方法。所以我们做的本质上是给类添加关联,不是直接把添加的属性放到原类的内存空间。要完成这个功能我们需要知道一个方法:

objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)第一个参数:给哪个类添加关联(属性)2:相关联的key 自己创建一个key 3:关联的值 属性名 4关联的策略

比如我要给某个分类t添加属性name  [email protected]"sun"(value) 然后static const NSString * [email protected]"name"(key)

重写name的get方法-(NSString *)name{reture objc_getAssociatedObject(self,key)};

最后重写name的set方法,在里面调用setAss方法将key value等参数写好就创建了关联。

时间: 2024-10-04 17:32:42

对RunTime的一点认识的相关文章

OC中Runtime浅析

近期了解了一下OC的Runtime,真的是OC中非常强大的一个机制,看起来比較底层,但事实上能够有非常多活用的方式. 什么是Runtime 我们尽管是用Objective-C写的代码,事实上在运行过程中都会被转化成C代码去运行.比方说OC的方法调用都会转成C函数 id objc_msgSend ( id self, SEL op, - ); 而OC中的对象事实上在Runtime中都会用结构体来表示,这个结构体中包括了类名.成员变量列表.方法列表.协议列表.缓存等. 类在Runtime中的表示:

iOS面试3

转:http://studentdeng.github.io/blog/2014/02/11/baidu-interview/ 百度面试 FEB 11TH, 2014 | COMMENTS 百度移动云可穿戴部门的面试经历,面试官都非常热情友好,一上来到弄的我挺不好意思的.下面记录一下自己的面试过程,因为我真的没啥面试经验,需要总结下. 1面 Objective C runtime library:Objective C的对象模型,block的底层实现结构,消息发送,消息转发,这些都需要背后C一层

网友的百度移动云可穿戴部门的面试经历

1面 Objective C runtime library:Objective C的对象模型,block的底层实现结构,消息发送,消息转发,这些都需要背后C一层的描述,内存管理. Core Data:中多线程中处理大量数据同步时的操作. Multithreading:什么时候处理多线程,几种方式,优缺点. Delegate, Notification,KVO, other 优缺点 runtime有一点追问,category,method 的实现机制,class的载入过程. 1面整体感觉不错,4

Runtime

参考资料:http://www.jianshu.com/p/19f280afcb24 类和对象 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等. 这种特性意味着Objective-C不仅需要一个编译器,还需要一个运行时系统来执行编译的代码.对于Objective-C来说,这个运行时系统就像一个操作系统一样:它让所有的工作可以正常的

新闻发布的一点小总结

经过一段时间的学习,完成了新闻发布的基础功能,进行一点小总结,方便日后回顾.下面是我的一点小总结,不足之处请勿见笑... 我们想要完成一个新闻发布,首先要使其能够成功发布,并且让它能够实现添加.删除.修改.查询.上传.下载等功能.我们还调用AJAX功能查看输出为XML.JSON格式的新闻内容.为完成以上功能,我们首先要进行jdk.tomcat.eclipse的安装和配置.1.各软件的安装和配置1.1.jdk的安装和配置: 1.1.1.下载jdk:下载地址:http://www.oracle.co

Runtime-b

感谢大神分享 依旧是网上很多runtime的资料,依旧是看不懂,,,这里给大家转化一下runtime,使它由隐晦难懂变得通俗易懂. (虽然截图和语言组织的有些凌乱,但是大家还是一点一点的阅读下去吧,可以新建一个工程,跟着我写的一步一步的自己走一遍,会有帮助的.) 关于runtime理论性的东西可以参考我们同事hah的初识runtime(我俩的文章名字居然差不多) 本文参照:教你快速上手Runtime.谢谢该文作者峥吖峥老师.有兴趣的也可以去峥老师的博客看看去. 另外哪里写的不对,可以给我留言,我

Objective-C Runtime 运行时之六:拾遗

super 在Objective-C中,如果我们需要在类的方法中调用父类的方法时,通常都会用到super,如下所示: @interface MyViewController: UIViewController @end @implementation MyViewController - (void)viewDidLoad { [super viewDidLoad]; // do something ... } @end 如何使用super我们都知道.现在的问题是,它是如何工作的呢? 首先我们需

iOS开发——高级特性&amp;Runtime运行时特性详解

Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 简介 与Runtime交互 Runtime术语 消息 动态方法解析 消息转发 健壮的实例变量(Non Fragile ivars) Objective-C Associated Objects Method Swizzling 总结 引言 曾经觉得Objc特别方便上手,面对着 Cocoa 中大量

ArcGIS Runtime for Android开发教程V2.0(1)基本概念

原文地址: ArcGIS Runtime for Android开发教程V2.0(1)基本概念 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/arcgis_mobile/article/details/8113183   1.基本概念 1.1 Android简介         2007年11月,Google推出移动操作系统Android,并宣称Android是首个为移动终端打造的真正开放和完整的移动操作系统.自此,基于And