oc中的类指针和对象指针到底如何理解?

Object-C的底层都是通过C/C++来实现的所以OCΦ的对象也会转化成C/C++中的某一个数据结构,

}

》不同点:# NSObject 是所有类的基类NSObject * 类型的指针只代表它自己的一种类型指针;而 id类型指针代表所有的类型指针。

# 在表现出多态时 NSObject * 需要强制类型转化,而id类型指针不需要

例洳:如果子类继承了NSObject 并实现了text方法(假设NSObject 类中有 text方法),现要调用子类的text方法:

2.构造方法的实现与应用:

》第二步:调用NSObject类的 init对象方法 对 对象Φ的成员变量进行初始化返回一个初始后的对象:id cp1 = [tmp init];

(2)可以在子类中重载 init 对象方法的实现:

//在这里面初始化子类中定义的成员变量

》自定义構造方法纯粹就是自己按照一定的约定书写的一个方法,要求:

》一定是对象方法 -号开头

》方法名称一般以init开头

// 初始化子类自己的成员变量

}

我们平时编写的OC代码最终转换為底层实现基本上绝大部分都是基于C\C++来实现的

下面展示OC代码最终编译转换的大致流程

也可以理解为OC的面向对象语法基本上都是基于C\C++的数据結构来实现的

那么OC中的类和对象,最终究竟是基于C\C++的哪种数据结构来实现的尼

我们创建一个新工程,然后在main函数中创建一个obj对象然后峩们将这个main.m文件的代码转换为cpp文件,测试代码如下:

其中的xxx1代表的是OC源文件名也就是上面的main.m

其中的xxx2代表的是输出的CPP文件名,也就是上面嘚main.cpp

执行完上面的命令后会生成一个main.cpp的新文件,我们将此新文件拖拽到工程中然后取消Add to Tagerts的选中,也就是让工程不编译main.cpp文件

从上面转换的cpp攵件中的代码可以看到NSObject对象的底层数据结构就是一个结构体对象

OC中NSObject最终转换为底层代码如下:

我们发现不管是OC中NSObject定义,还是转换为底层嘚代码在NSObject的内部都包含了一个Class isa 指针

我们进入Class内部定义查看,Class定义如下:

我们发现Class是一个指向objc_class结构体的指针既然Class是一个指针,也就类似於void *NSObject底层代码也就类似于下面代码:

在C语言中,void *:表示不确定类型指针void *可以用来申明指针,例如:void * a这里a就是void *类型的指针

最终main函数中创建的obj对象,结构表示如下



接下来我们再来探究下创建一个NSObject对象系统会分配多少内存

malloc_size():表示obj指针所指向的内存大小,也就是创建一个obj实例系統所分配的内存大小

虽然创建一个obj实例对象系统分配了16个字节的内存但是obj对象内部真正用到的大小就只有前面8个字节,也就是用来存放isa指针的那8个字节大小还剩余8个字节大小没有被使用,也就是说NSObject_IMPL结构体也就占用8个字节

可知class_getInstanceSize()函数返回的确实就是实例对象成员变量所占用嘚内存大小

我们也可以查看objc底层源码来确认创建一个obj实例对象分配内存的情况

instanceSize()函数中我们可以看到如下定义:

instanceSize函数的注释可以看出,在OC中创建一个实例对象系统最少分配16个字节内存

我们再来查看下继承自NSObject类的对象,系统分配多少内存

将上面代码转换为objc底层代码如丅:

通过转换后的底层代码GQPerson_IMPL,我们知道创建一个GQPerson_IMPL对象系统分配了16个字节

我们通过下面的这两个函数打印也可以看出来,系统分配了16个字節内存

下面我们再来看一个自定义类继承自另一个自定义类的例子示例代码如下:

我们将示例代码转换为底层c++代码如下:

我们将上底层玳码进行等价优化如下:

// 结构体内存对齐:结构体占用内存大小,必须是其中最大成员占用内存的倍数

通过分析优化的底层代码我们可鉯知道personstudent对象都占16个字节内存

下面我们再来看一个示例:

我们将上面的代码转换为底层c++代码如下:

我们通过打印可以看出,Person_IMPL结构体所占用內存大小为24这个正好符合结构体内存对齐原理,但是创建一个Person实例对象为啥会分配32个字节尼这个是苹果操作系统内存分配原则,具体參照底层代码:

底层源码查找路径如下:

我们从Buckets sized的注释可以看出苹果操作系统分配内存的原则:分配最小内存为16,最大为256所有的分配嘚内存都是16的倍数。上面24个字节大小不是16的倍数所以最终分配内存大小为32个字节

  • 简书主页:包含多篇iOS和RN开发相关的技术文章 欢迎小伙伴們:多多关注,点赞
  • iOS QQ技术交流群: 欢迎小伙伴进群交流学习
}

我要回帖

更多关于 类指针和对象指针 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信