要了解 isa 指针先了解下类的定义
在xcode中用快捷键Shift+Cmd+O 搜索objc.h 能看到类的定义:
了解

Paste_Image.png

可以看出:
objc_object:Objective-C对对象的定义, 其质上是结构体对象,其中 isa是它唯一的私有成员变量,即所有对象都有isa指针
Class 是一个 objc_class 结构类型的指针
id是一个 objc_object 结构类型的指针,这也是id可以指向任何对象的原因
SEL(方法选择器)是一个objc_selector结构类型的指针
IMP 先不提

再搜runtime.h

Paste_Image.png

每个对象结构体的首个成员是Class类的变量,该变量定义了对象所属的类,通常称为isa指针

super_class:父类,如果该类已经是最顶层的根类,那么它为NULL。
version:类的版本信息,默认为0
info:供运行期使用的一些位标识。
instance_size:该类的实例变量大小
ivars:成员变量的数组
struct objc_method_list **methodLists OBJC2_UNAVAILABLE : 方法列表,类目就是通过它添加方法的

struct objc_cache *cache OBJC2_UNAVAILABLE : 方法缓存,对象接到一个消息会根据isa指针查找消息对象,这时会在methodLists中遍历,如果cache了,常用的方法调用时就能够提高调用的效率。

struct objc_protocol_list *protocols OBJC2_UNAVAILABLE : 协议链表

isa 指针优化(NONPOINTER_ISA)

用 64 bit 存储一个内存地址显然是种浪费,毕竟很少有那么大内存的设备。于是可以优化存储方案,用一部分额外空间存储其他内容。isa 指针第一位为 1 即表示使用优化的 isa 指针,这里列出不同架构下的 64 位环境中 isa 指针结构:

union isa_t
{isa_t() { }isa_t(uintptr_t value) : bits(value) { }Class cls;uintptr_t bits;
#if SUPPORT_NONPOINTER_ISA
# if __arm64__ # define ISA_MASK 0x00000001fffffff8ULL # define ISA_MAGIC_MASK 0x000003fe00000001ULL # define ISA_MAGIC_VALUE 0x000001a400000001ULL struct { uintptr_t indexed : 1; uintptr_t has_assoc : 1; uintptr_t has_cxx_dtor : 1; uintptr_t shiftcls : 30; // MACH_VM_MAX_ADDRESS 0x1a0000000 uintptr_t magic : 9; uintptr_t weakly_referenced : 1; uintptr_t deallocating : 1; uintptr_t has_sidetable_rc : 1; uintptr_t extra_rc : 19; # define RC_ONE (1ULL<<45) # define RC_HALF (1ULL<<18) }; # elif __x86_64__ # define ISA_MASK 0x00007ffffffffff8ULL # define ISA_MAGIC_MASK 0x0000000000000001ULL # define ISA_MAGIC_VALUE 0x0000000000000001ULL struct { uintptr_t indexed : 1; uintptr_t has_assoc : 1; uintptr_t has_cxx_dtor : 1; uintptr_t shiftcls : 44; // MACH_VM_MAX_ADDRESS 0x7fffffe00000 uintptr_t weakly_referenced : 1; uintptr_t deallocating : 1; uintptr_t has_sidetable_rc : 1; uintptr_t extra_rc : 14; # define RC_ONE (1ULL<<50) # define RC_HALF (1ULL<<13) }; # else // Available bits in isa field are architecture-specific. # error unknown architecture # endif // SUPPORT_NONPOINTER_ISA #endif };

SUPPORT_NONPOINTER_ISA 用于标记是否支持优化的 isa 指针,其字面含义意思是 isa 的内容不再是类的指针了,而是包含了更多信息,比如引用计数,析构状态,被其他 weak 变量引用情况。判断方法也是根据设备类型:

#if !__LP64__  ||  TARGET_OS_WIN32  ||  TARGET_IPHONE_SIMULATOR  ||  __x86_64__
#   define SUPPORT_NONPOINTER_ISA 0 #else # define SUPPORT_NONPOINTER_ISA 1 #endif

isa指针会判断是否支持 TaggedPointer 支持会直接将其指针值作为引用计数返回

TaggedPointer 就是一种优化方式,当承载内容小于8字节时,指针直接储存承载内容

关于Tagged Pointer 这里有详细介绍
http://www.infoq.com/cn/articles/deep-understanding-of-tagged-pointer/

如果当前设备是 64 位环境并且使用 Objective-C 2.0(5s之后就都是64位),那么“一些”对象会使用其 isa 指针的一部分空间来存储它的引用计数;否则 Runtime 会使用一张散列表来管理引用计数

64位中isa 指针中变量对应的含义:

Paste_Image.png

associate object : 关联对象

IMP 指针

Paste_Image.png

SEL会依据方法名生成唯一的表示作为key ,便于查找

IMP指针是指向实现函数的指针,通过SEL取得IMP,objc_msgSend来执行实现方法

objc_msgSend函数在执行方法时不会直接在 isa 指针指向的类的方法列表中遍历查找能够响应的方法,因为每次都要查找效率太低了,而是优先在缓存(方法列表)中查找,若是找不到再沿着继承体向上查找。每次匹配到的结果会缓存在"快速映射表"里,来提高效率,同时objc_msgSend函数用到了"尾调用优化技术",来节约资源,感兴趣可以了解下
https://en.wikipedia.org/wiki/Tail_call
http://kb.cnblogs.com/page/518771/

//引用文章
http://www.cocoachina.com/ios/20151209/14636.html
http://www.cocoachina.com/ios/20150717/12623.html
http://www.cnblogs.com/ioshe/p/5489086.html

转载于:https://www.cnblogs.com/LifeTechnologySupporter/p/6741943.html

Runtime之IMP指针,isa指针相关推荐

  1. 6 OC 中的isa 指针

    目录 一 isa 指针 二 类对象中的superclass 一 isa 指针 isa 指针 ,OC 中的对象都是有的 如下图所示,实例对象isa 指针指向 类对象,类对象的isa 指针指向 元类对象 ...

  2. iOS经典面试题之深入解析objc对象的内存空间、数据结构以及isa指针的理解

    一.objc 对象的 isa 的指针指向什么?有什么作用? isa 等价于 is kind of: 实例对象 isa 指向类对象: 类对象指 isa 向元类对象: 元类对象的 isa 指向元类的基类: ...

  3. iOS class深入理解: 实例对象、类对象、元类和isa指针

    你要知道的class都在这里 转载请注明出处http://blog.csdn.net/u014205968/ 深入代码理解instance.class object.metaclass 面向对象编程中 ...

  4. Golang——指针的使用、数组指针和指针数组、指针与切片、指针与结构体、多级指针

    指针: 指针是一个特殊的变量,因为存储的数据不仅仅是一个普通的数据,而是一个变量的内存地址,指针本身也是有内存地址的 指针的数据类型有int.float.bool.string.数组.结构体 指针的作 ...

  5. Go基础:指针地址、指针类型、多重指针、指针运算

    目录 到底什么是指针呢? 指针 指针地址和指针类型 指针取值 指针变量初始化 指针运算符 多重指针 指针运算 到底什么是指针呢? 内存就是一系列有序列号的存储单元,变量就是编译器为内存地址分配的昵称, ...

  6. C++ 笔记(27)— 指针变量、数组和指针、指针数组、数组指针、指针常量与常量指针

    1. 什么是指针变量? 指针变量是专门有一个变量来存放指针. int main(int argc, char *argv[]) {int a = 10;int *p = &a; //通过取地址 ...

  7. 关于C语言中的数组指针、指针数组以及二级指针

    概念解释 数组指针:首先它是一个指针,它指向一个数组,即指向数组的指针:在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道.数组指针指向的是数组中的一个具体元素,而不是整个数组,所 ...

  8. C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)

    1. 声明指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明. 指针变量声明的一般形式为: type * ...

  9. Go 学习笔记(13)— 指针定义、指针特点、空指针、指针数组、指向指针的指针、指针作为函数入参

    1. 复合数据类型 Go 语言基本的复合数据类型有指针.数组.切片.字典.通道.结构和接口等.格式如下: * pointerType // 指针类型, [n]elementType // 数组类型, ...

最新文章

  1. CISCO与华为3COM路由器配置差别
  2. ipad连接电脑_这些应用让iPad生产力分分钟UP
  3. [Leedcode][JAVA][面试题 16.18][模式匹配][字符串][枚举]
  4. 【HDU - 1518】Square (经典的dfs + 剪枝)
  5. 60-150-046-使用-Sink-Flink落HDFS数据按事件时间分区解决方案
  6. 用JS实现简单的省市联动
  7. Office编程中得到extend对象
  8. 有关文档流的一些注意事项
  9. opencv codebook
  10. VisionPro 常用工具介绍
  11. MEGA-X 3D打印机教程:05_更换步进电机驱动
  12. python appium+夜神模拟器 配置 笔记整理
  13. java中的this是什么意思
  14. java中pmt计算_5个财务函数FV、PV、PMT、NPER与
  15. java点歌系统代码_基于jsp的KTV点歌系统-JavaEE实现KTV点歌系统 - java项目源码
  16. IDEA修改快捷键方法(在原快捷键不变的基础上增加自己习惯的快捷键)
  17. EXIT: Extrapolation and Interpolation-based Neural Controlled Differential Equations for Time-series
  18. php js sdk 签名算法,签名算法 · PAYJS API 开发文档
  19. 信源编码作业(1)——绘制并分析清浊音频谱图
  20. java英语介绍_java自我介绍英语口语

热门文章

  1. VNC CentOS
  2. 【wikioi】1022 覆盖(匈牙利)
  3. 驱动硬件Framebuffer驱动程序框架 skeletonfb.c 分析
  4. 域 和 Session 的问题
  5. [CVPR2016]Learning Deep Feature Representations with Domain Guided Dropout for Person Re-id
  6. python多图拼接并利用resnet提取特征
  7. 二叉查找树Java实现代码
  8. 有关子矩阵最大累加和的总结
  9. iso linux 内核版本号_Linux查看 iso 版本信息
  10. matlab画微分方程的矢量场图_MATLAB偏微分方程