文档章节

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

云飞扬v5
 云飞扬v5
发布于 2016/11/20 15:25
字数 730
阅读 10
收藏 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
粉丝 11
博文 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

没有更多内容

加载失败,请刷新页面

加载更多

web打印控件 LODOP的详细api

web打印控件 LODOP的详细api

wangxujun59
54分钟前
2
0
从一次小哥哥与小姐姐的转账开始, 浅谈分布式事务从理论到实践

分布式事务是个业界难题,在看分布式事务方案之前,先从单机数据库事务开始看起。 什么是事务 事务(Transaction)是数据库系统中一系列操作的一个逻辑单元,所有操作要么全部成功要么全部失...

中间件小哥
56分钟前
6
0
荣登Github日榜!微信最新开源MMKV

MMKV 开源当日即登Github Trending日榜,三日后荣登周榜。MMKV 在腾讯内部开源半年,得到公司内部团队的广泛应用和一致好评。 MMKV 是基于 mmap 内存映射的移动端通用 key-value 组件,底层序...

腾讯开源
今天
5
0
前端取色工具:jcpicker

http://annystudio.com/software/colorpicker/#jcp-download

轻量级赤影
今天
1
0
Swift - 将图片保存到相册

import Photos func loadImage(image:UIImage) { UIImageWriteToSavedPhotosAlbum(image, self, #selector(saveImage(image:didFinishSavingWithError:contextInfo:)), ni......

west_zll
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部