美文网首页
C语言第二篇:内存分析(二) 类的本质

C语言第二篇:内存分析(二) 类的本质

作者: 一片枫叶随风舞 | 来源:发表于2017-11-14 00:42 被阅读0次

一、什么是类?

如果从数据结构来说。类其实就是升级版的结构体,在C语言的机构体中,只能定义属性,但不能定义方法,而类的升级,就是升级在,类不仅仅包含属性,还可以定制方法,其实就是一个可以实现某种功能的方法和属性的结合,例如可以定义一个分数类,这个类中,有总成绩、平均成绩两个属性,有加法和平均法两个方法,这就是一个类了,所以类的本质就是结构体,上一节也有例子进行佐证。

二、类的加载和初始化

如下图创建了三个类 person、student、animal三个类

类的加载:程序一运行就会加载类的一部分

+(void)load

当用到某个类的时候再加载全部,进行初始化

+(void)initialize


二、类在内存中的存储

类在创建的过程中,是如何在内存中存储的?

我们就以下图下图创建person1对象为例

执行该语句包含三部分 1.在代码区中加载Person类的所有代码 2在堆内存中创建Person类的类对象 ,然后根据Person类的类对象创建person实例对象 3.把实例对象person在堆中的地址赋值给存储在栈区的person1对象指针

其具体过程参照下图

由此我们可以得出以下结论

1、类其实分为两类

     (1)类对象 

                注意 :当类被使用时每个类有且只有一个类对象

                            既然是“对象”,就有类型 其类型就是Class类型 

                            所有的实例对象的isa都指向了“类对象”,类对象存储类类中

                            所有方法的函数指针(SEL),SEL 是一种专门存储函数指针的数据类型

     (2)实例对象 

                注意:通过类对象创建实例对象,

                            这个实例对象存储了类中的所有成员变量 

                            每个实例对象中都包含isa指针,这个指针指向该类的类对象

谈谈感悟:其实我们可以类比一下结构体

一.定义

1、 struct student{

int  age;

}

2、类对象 Person


二、使用

struct student goodStudent;

Person *person = [Person alloc]init];


2、类、类对象、实例对象、方法、属性在内存中的存储

类:存储在代码区

类对象、实例对象、属性 存储在堆区

代表方法的函数指针存储在类对象中,也就是堆区中

3、分析类和类对象分开以及类对象和实例对象分开的好处

类代码存储在代码区:如果方法跟着类对象或者实例对象那就会占用堆中的很大空间

类对象:类对象创建一个,实例对象就不会都存储函数指针,只要想用是根据isa指针找到对应的类对象

然后根据对应的SEL找到存储在代码区中类的对应方法的代码段执行

这样分开都会节省很多内存

4.实例对象中的isa指针指向自己的类对象,自己类对象的isa指针指向了内存中类代码 如下图所示,

执行方法时,是到类方法中的方法列表中寻找,KVO原来,isa指针指向谁就到那个类对象中找对应的方法

kvo证明 1 runtime可以动态添加类 

               2 动态绑定方法  改变isa

    

相关文章

  • C语言第二篇:内存分析(二) 类的本质

    一、什么是类? 如果从数据结构来说。类其实就是升级版的结构体,在C语言的机构体中,只能定义属性,但不能定义方法,而...

  • C语言第二篇:内存分析(一)(C语言)

    上一节我们知道C语言中有很多种数据类型,这些数据类型在内存中是如何存储的呢? 下面我们来分析一下 一、int型基本...

  • OC对象的本质(上)

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

  • C语言内存分析☀️

    版权声明:本文为博主原创文章,未经博主允许不得转载。 一、进制 概念:进制是一种计数方式,是数值的表现形式 4种主...

  • 理解JS中的原型

    动态语言和静态语言有很大的不同,比如在C++中定义类时,并不分配内存,而在动态语言中定义类时,却会分配内存。 比如...

  • (二)C语言之动态内存分配

    (二)C语言之动态内存分配 一、静态内存分配 定义是指定分配的内存长度就是静态内存分配,是在栈内存中分配 二、C语...

  • OC 对象的本质02

    自定义类的内存本质 自定义一个student 类 将Objective-c代码转换成 C\C++的代码 找到Stu...

  • iOS Runtime之类与对象的本质

    Runtime 解析 2.0 类与对象的本质 Runtime是Objective-C语言与C语言最大的一个不同,通...

  • 目录

    tips:一下内容都是C语言中文网的内容,我只是摘取我需要的知识 二.C++类和对象 (1)C++对象的内存模...

  • C语言变量内存分析

    变量内存分析 变量在内存中的表现形式 图解1.开辟内存空间从大地址向小地址开辟2.变量的首地址,是变量所占存储空间...

网友评论

      本文标题:C语言第二篇:内存分析(二) 类的本质

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