文档章节

OC类对象本质以及消息发送原理

云飞扬v5
 云飞扬v5
发布于 2016/11/20 15:25
字数 730
阅读 12
收藏 0

 

NSObject

打开<objc/NSObject>

NSObject含有一个Class类型的isa指针。

@interface NSObject <NSObject> {
    Class isa  OBJC_ISA_AVAILABILITY;
}

objc/objc.h

struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

 

OC Class的本质

在XCode中按Shift + Command + O打开文件搜索框,然后输入NSObject.h和objc.h,

可以看到如下的内容

typedef struct objc_class *Class;

因此OC中的Class 也就是 一个结构体objc_class的指针

 

再在runtime.h中看objc_class的定义

struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class super_class                                        OBJC2_UNAVAILABLE;
    const char *name                                         OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;

objc_class是一个结构体,包含一个

Class类型的isa,

父类的指针Class super_class,

类名 name, 

struct objc_ivar_list *ivars               成员变量的列表              

struct objc_method_list **methodLists                 方法列表

struct objc_cache *cache                                
struct objc_protocol_list *protocols   协议列表

 

因为类也是一个对象,那它也必须是另一个类的实例,这个类就是元类 (metaclass)。

 

 

消息发送的机制

 

 一个接收者对象接收到一个消息时,它会根据isa指针去查找能够响应这个消息的对象。 优先去cache中查找,如果cache没有,才去methodLists中查找方法。这样,对于那些经常用到的方法的调用,但提高了调用的效率。如果methodlists中没有,会去父类中继续查找。

如果查到根类Root Class仍然没有,那就启动消息转发机制。

类方法也是类似的原理。

消息转发机制

消息的转发分为两大阶段。

第一阶段先征询接收者,所属的类,看其是否能动态添加方法,以处理当前这个“未知的选择子”(unknown selector),这叫做“动态方法解析”(dynamic method resolution)。

 

第二阶段涉及“完整的消息转发机制”。如果运行期系统已经把第一阶段执行完了,那么接收者自己就无法再以动态新增方法的手段来响应包含该选择子的消息了。此时,运行期系统会请求接受者以其他手段来处理与消息相关的方法调用。这又细分为两小步。首先,请接受者看看有没有其他对象处理这条消息。若有,则运行期系统会把消息转给那个对象,于是消息转发过程结束,一起如常。若没有“备援的接收者”,则启动完整的消息转发机制,运行期系统会把于消息有关的全部细节都封装到NSInvocation对象中,再给接收者最后一次机会,令其设法解决当前还未处理的这条消息。

 

 

参考资料

类的本质-类对象

http://www.jianshu.com/p/374b570e1920

 

iOS开发探索-Runtime原理解读及实践
 http://www.jianshu.com/p/462b88edbe5c 

 

深入理解Objective-C消息转发机制

http://www.cocoachina.com/ios/20160830/17424.html

 

© 著作权归作者所有

共有 人打赏支持
云飞扬v5
粉丝 12
博文 105
码字总数 67465
作品 0
金华
私信 提问
iOS底层原理总结 - 探寻Runtime本质(三)

方法调用的本质 本文我们探寻方法调用的本质,首先通过一段代码,将方法调用代码转为c++代码查看方法调用的本质是什么样的。 通过上述源码可以看出c++底层代码中方法调用其实都是转化为 函数...

xx_cc
07/02
0
0
runtime应用场景

一、runtime简介 RunTime简称运行时。OC就是,也就是在运行时候的一些机制,其中最主要的是消息机制。对于C语言,。对于OC的函数,属于,在编译的时候并不能决定真正调用哪个函数,只有在真正...

刀客445
2016/05/20
8
0
Swift 方法选择器 Selector 监听事件

Swift.png 在编程的过程中监听事件是我们经常使用的,在OC中使用@SEL选择器,那么在Swift中 Selector选择器, 监听事件的本质是 发送消息,也就是OC 中的消息机制 原理如下: 将方法包装成@SE...

追逐iOS
2017/12/07
0
0
iOS 模块分解—「Runtime面试、工作」看我就 🐒 了 ^_^.

引导 相信对于从事开发人员来说 runtime 这个名称都不陌生,就像我起初只知道「 runtime 叫运行时 」,后来知道 runtime 同样可以像 KVC 一样访问私有成员变量,还有「 给类动态添加属性:L...

public-不知名开发者
09/19
0
0
iOS 模块详解—「Runtime面试、工作」看我就 🐒 了 ^_^.

iOS 模块详解—「Runtime面试、工作」看我就 🐒 了 ^_^. 转载:原地址https://www.jianshu.com/p/19f280afcb24 引导 对于从事 iOS 开发人员来说,所有的人都会答出「 Runtime 是运行时 」,...

法斗斗
04/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

我是如何将博客转成PDF的

前言 只有光头才能变强 之前有读者问过我:“3y你的博客有没有电子版的呀?我想要份电子版的”。我说:“没有啊,我没有弄过电子版的,我这边有个文章导航页面,你可以去文章导航去找来看呀”...

Java3y
10分钟前
0
0
nginx的一些总结

Linux下安装Nginx完整教程及常见错误解决方案 1.Nginx安装环境 Nginx是C语言开发,建议在linux上运行,本教程使用Centos7.0作为安装环境. 1)gcc 安装nginx需要先将官网下载的源码进行编译,编译...

Yao--靠自己
16分钟前
0
0
Predicate函数式接口

Predicate接口主要用于流的筛选,比如在filter方法中传入Predicate判断。 作为函数式接口,这里居然有三个default方法,一个static方法,子孙满堂! 正统的接口方法,就是boolean test(T t)...

woshixin
17分钟前
0
0
sql 开窗函数

开窗函数:在开窗函数出现之前存在着很多用 SQL 语句很难解决的问题,很多都要通过复杂的相关子查询或者存储过程来完成。为了解决这些问题,在 2003 年 ISO SQL 标准加入了开窗函数,开窗函数...

hblt-j
28分钟前
1
0
使用Vue动态生成form表单的实例代码

具有数据收集、校验和提交功能的表单生成器,包含复选框、单选框、输入框、下拉选择框等元素以及,省市区三级联动,时间选择,日期选择,颜色选择,文件/图片上传功能,支持事件扩展。 欢迎大家s...

嫣然丫丫丫
35分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部