美文网首页
Objective-C的内存布局

Objective-C的内存布局

作者: xiny123 | 来源:发表于2019-02-13 14:31 被阅读0次

Objective-C的内存布局

在Objective-C中任何的类定义都是对象。即在程序启动的时候任何类定义都对应一块内存。在编译的时候,编译器会给每一个类生成一个且只生成一个“描述其定义的对象”,也就是类对象(class object),它是一个单列(singleton),而我们在C++等语言中所谓的对象,叫做实例对象(instance object)。对于实例对象我们不难理解,但类对象(class object)是什么呢?我们知道Objective-C是门动态的语言,因此程序里的所有实例对象(instance object)都是运行时由Objective-C的运行时库生成的,而这个类对象(class object)就是运行时库用来创建实例对象(instance object)的依据。

任何直接或间接继承了NSObject的类,它的实例对象(instance object)中都有一个isa指针,指向它的类对象(class object)。这个类对象中存储了关于这个实例对象(instance object)所属的类结构信息,包括定义的方法,遵守的协议等等。

以上可以看到如果要讨论OC中的内部布局,就要讨论两种布局:实例对象的内存布局、实例对象所属的类对象(class)的内存布局。

  1. 实例变量(包括父类) 都保存在对象本身的存储空间内;
  2. 本类的实例方法 保存在类对象中
  3. 本类的类方法 保存在元类对象中
  4. 父类的实例方法 保存在各级super class中
  5. 父类的类方法 保存在各级super meta class中
20180103192707634.png

实例对象的内存布局

isa指向其类对象,其余空间保存各级的ivar

ISA pointer
Root class's ivars
Penultimate superclass's ivars
...
Super class's ivars
Class's ivars

类对象的内存布局

(详细可看 runtime.h 中对 objc_class 的定义),isa 指向其元类,super_class指向其父类,此外还包含实例变量列表、方法列表、协议列表:

isa
supre class
class name
ivars list
methods list
protocols list
others

相关文章

  • 对象在内存中的布局

    参考文章:一个objc对象如何进行内存布局?(考虑有父类的情况) Objective-C内存布局 参考如下的3张图...

  • Objective-C的内存布局

    Objective-C的内存布局 在Objective-C中任何的类定义都是对象。即在程序启动的时候任何类定义都对...

  • Objective-C 引用计数的原理和内部实现

    背景 - 内存管理 Objective-C 建立在 C 语言的基础上。C 语言程序的内存布局主要包括: 栈:由编译...

  • Objective-C内存布局

    对象(object)即一块内存,本文要探讨的是一个Objective-C对象在内存的布局(layout)问题,一个...

  • 面试题收集

    一个Objective-C对象如何进行内存布局[https://www.cnblogs.com/huangzs/p...

  • OC对象的本质(上)

    iOS | OC对象本质 | Objective-C 什么是OC语言,OC对象、类的本质是什么,OC对象的内存布局...

  • iOS的内存管理

    Objective-C需要自己考虑内存管理,但是如果熟悉Objective-C的内存管理机制,手工管理内存其实也并...

  • Objective-C实例对象的内存布局

    结论: 实例对象的内存布局情况如下:ISA指针,根类的实例变量,倒数第二层父类的实例变量,…,父类的实例变量,类的...

  • iOS内存布局

    内存布局图内存布局图 代码演示

  • iOS内存管理底层原理

    内存布局 了解程序内存布局请点击程序的内存布局以及栈、堆原理[https://www.jianshu.com/p/...

网友评论

      本文标题:Objective-C的内存布局

      本文链接:https://www.haomeiwen.com/subject/enireqtx.html