OC的runtime运行机制

什么是runtime

runtime就是一套底层的c语言API(Application Programming Interface)里面包括很多强大实用的c语言类型、c语言函数。

实际上,平时我们编写的oc代码,底层都是基于runtime实现的。

也就是说我们平时编写的oc代码最终都是转成了底层的runtime代码(c语言代码) 。

[obj say] —> 调用id objc_msgSend(id self, SEL op, ...)函数 -> 里面的obj.isa指针-> class -> class.cache_List -> class.Method_List -> superClass

例如 [obj say]; 像这样对象执行一个方法的时候转成了runtime库里面的C语言函数即 objc_msgSend(objc, @selector(say))

内部对象寻找到方法并执行的具体步骤:

MRC开发环境下
1.先检查 @selector 方法是否可以省略
2.检查 target(目标对象objc) 是否为 nil,如果为 nil 就 clearout 并直接 return
3.找到 target 对应的class,然后根据 @selector 找到IMP(函数指针)
4.先从当前class的一个方法名叫cache_List缓存列表去找,找到就跳到对应的IMP实现方法,如果没找到,就去method_List方法列表找
5.如果再没找到就去父类的super_List找,一直找到基类(NSObject)为止,如果还找不到就进入动态解析和消息转发机制

duang~daung~daung  runtime的核心来了就是动态解析

讲到这里我们知道内部是这样走的那么是不是可以拦截所有的系统方法为我们自己所用,同样我们要想精通一个类就可以解开他每一个实例变量和方法

runtime有啥用?

当遇到 不使用继承的方法给系统类添加一个外界可以访问的公共属性 使用runtime就可以完美解决

1>能动态生成一个类,一个成员变量,一个方法
2>能动态修改一个类,一个成员变量,一个方法
3>能动态删除一个类,一个成员变量,一个方法

常见的函数,头文件

#import<objc/runtime.h> : //成员变量,类,方法class_copyIvarList : 获得某个类内部的所有成员变量class_copyMethodList : 获得某个类内部的所有方法class_getInstanceMethod : 获得某个具体的实例方法 (对象方法,减号-开头)class_getClassMethod : 获得某个具体的类方法 (加号+开头)method_exchangeImplementations : 交换两个方法的实现-----------------------------------------------------------#import<objc/message.h> : //消息机制objc_msgSend(...)

1》runtime实现的机制是什么,怎么用,一般用于干嘛?


这个问题我就不跟大家绕弯子了,直接告诉大家,


runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API。


在我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者


比如说,下面一个创建对象的方法中,


举例:


OC :


[[MJPerson alloc] init]


runtime :


objc_msgSend(objc_msgSend(“MJPerson” , “alloc”), “init”)


第二个问题


runtime 用来干什么呢??用在那些地方呢?怎么用呢?


runtime是属于OC的底层, 可以进行一些非常底层的操作(用OC是无法现实的, 不好实现)


在程序运行过程中, 动态创建一个类(比如KVO的底层实现)


在程序运行过程中, 动态地为某个类添加属性\方法, 修改属性值\方法


遍历一个类的所有成员变量(属性)\所有方法


例如:我们需要对一个类的属性进行归档解档的时候属性特别的多,这时候,我们就会写很多对应的代码,但是如果使用了runtime就可以动态设置!


例如,PYPerson.h的文件如下所示


import


@interfacePYPerson : NSObject


@property (nonatomic, assign) int age;


@property (nonatomic, assign) int height;


@property (nonatomic, copy) NSString *name;


@property (nonatomic, assign) int age2;


@property (nonatomic, assign) int height2;


@property (nonatomic, assign) int age3;


@property (nonatomic, assign) int height3;


@property (nonatomic, assign) int age4;


@property (nonatomic, assign) int height4;


@end


而PYPerson.m实现文件的内容如下


#import "PYPerson.h"


import


@implementation PYPerson


(void)encodeWithCoder:(NSCoder)encoder


{


unsigned int count = 0;


Ivarivars = class_copyIvarList([PYPerson class], &count);


for (int i = 0; i


// 取出i位置对应的成员变量Ivar ivar = ivars[i];// 查看成员变量constchar*name = ivar_getName(ivar);// 归档NSString*key = [NSStringstringWithUTF8String:name];idvalue = [selfvalueForKey:key];[encoder encodeObject:value forKey:key];


}


free(ivars);


}


(id)initWithCoder:(NSCoder *)decoder


{


if (self = [super init]) {


unsignedintcount =0;Ivar *ivars = class_copyIvarList([PYPerson class], &count);for(inti =0; i


}


return self;


}


@end


这样我们可以看到归档和解档的案例其实是runtime写下的


学习,runtime机制首先要了解下面几个问题


1相关的头文件和函数


1> 头文件


利用头文件,我们可以查看到runtime中的各个方法!


2> 相关应用


NSCoding(归档和解档, 利用runtime遍历模型对象的所有属性)


字典 –> 模型 (利用runtime遍历模型对象的所有属性, 根据属性名从字典中取出对应的值, 设置到模型的属性上)


KVO(利用runtime动态产生一个类)


用于封装框架(想怎么改就怎么改)


这就是我们runtime机制的只要运用方向


3> 相关函数


objc_msgSend : 给对象发送消息


class_copyMethodList : 遍历某个类所有的方法


class_copyIvarList : 遍历某个类所有的成员变量


class_…..


这是我们学习runtime必须知道的函数!


4.必备常识


1> Ivar : 成员变量


2> Method : 成员方法


从上面例子中我们看到我们定义的成员变量,如果要是动态创建方法,可以使用Method

时间: 2024-11-05 11:31:59

OC的runtime运行机制的相关文章

oc - runtime运行机制

Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时做的事放到了运行时来处理.同时OC也是一门简单的语言,很大一部分是C的内容,只是在语言层面上加了关键字和语法,真正让OC强大的是它的运行时,它很小却很强大,其中核心是消息分发.这种动态语言的优势在于:我们写代码时更加灵活,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现. 这种特性意味着OC不仅需要一个编译器,还需要一个运行时系统来执行编译的代码.对于OC来说,这个运行时系统就像一个操作系统一样.这个运行时系

runtime运行机制方法学习

runtime这玩意第一次听说时都不知道是什么,经过了解后才知道它就是oc动态语言的机制,没有它那oc就不能称为动态语言.在之前可能大家对runtime了解都不深,随着编程技能的日益加深和需要,大家开始更加关心底层的实现,并用自己更需要的方式实现.这时runtime开始慢慢火起来了,作为一个iOS程序员,如果出去说自己不知道runtime无疑是一件很丢分的事情.由于runtime的底层实现笔者也没搞得太明白,在这里就跟大家提提几个关于runtime的方法. 1.runtime之动态添加属性 在最

runtime运行机制

这篇文章主要介绍的是runtime是什么以及怎么用!希望对读者有所帮助! 第一个问题, 1>runtime实现的机制是什么,怎么用,一般用于干嘛? runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API. 在我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者 比如说,下面一个创建对象的方法中, 对比举例: OC : [[MJPerson alloc] init] runtime

Runtime运行时机制原理、用途

首先我们先了解一下runtime实现机制及作用 1.runtime实现的机制是什么? runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API. 在我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者比如说,下面一个创建对象的方法中, 举例: OC : [[MJPerson alloc] init] runtime : objc_msgSend(objc_msgSend(“MJPe

runtime 运行时机制 完全解读

runtime 运行时机制 完全解读 目录[-] import import 我们前面已经讲过一篇runtime 原理,现在这篇文章主要介绍的是runtime是什么以及怎么用!希望对读者有所帮助! 首先,第一个问题, 1>runtime实现的机制是什么,怎么用,一般用于干嘛? 这个问题我就不跟大家绕弯子了,直接告诉大家, runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API. 在我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runti

?runtime 运行时机制

?runtime 运行时机制 完全解读 摘要 在最开始听到runtime的时候,我是感到恐惧的,多么高大上的东西啊!!!后来,开始在网上查一些资料,可是就是只有那么几篇,看了好久,还不知所云,所以就更加恐惧了!!!!后来经过查看documents 以及一些国外大牛的blogs,终于对runtime有了更深刻的了解!于是就想写下这些东西,希望对读者们有帮助…… runtime 运行时机制 详细解读 目录[-] import import 我们前面已经讲过一篇runtime 原理,现在这篇文章主要介

iOS开发——高级技术OC篇&amp;运行时(Runtime)机制

运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档. 下面就来看看什么是运行时,我们要怎么在iOS开发中去使用它. 官方介绍: 这里我们主要关注的是最后一种! 下面来看看Runtime的相关总结 #pragma mark 获取属性成员 /********************************************************

iOS的runtime运行时机制

本文转自http://www.cnblogs.com/guoxiao/p/3583432.html 最近一直在研究runtime运行时机制的问题,我想可能也有很多人不太清楚这个问题吧?在这里跟大家沟通分享下我对与runtime机制的理解. 要理解runtime,首先我们要了解类和对象的内部结构,下面将首先介绍下OC中类与对象的结构层次. 一.首先,从 runtime.h头文件中找到对 class 与 object 的定义 /// An opaque type that represents an

OC中Runtime浅析

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