OC对象的本质


前言

理解代码的本质也需在开发中用不到,但是可以帮助你理解代码是如何运行的如何在内存中分配的
当你在转学其它语言的时候本质是不变的!!!


我们平时编写的OC代码底层其实都是C/C++代码,这样转换的

Objective-C
C/C++
汇编语言
机器语言

所以Objective-C的面向对象,类都是基于C/C++的结构体实现的

一、NSObject探索

创建一个objc,通过命令转换成C/C++,在C++中就可以看到NSObject结构体

Xcode的自带功能
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cpp
main.m要转换的文件
-o main.cpp输出的文件
.cpp代表c++文件

在这里插入图片描述
在这里插入图片描述
也就是说NSObjc底层

@interface NSObject {
	class isa;
}
@end

转换成C++

struct NSObject_IMPL {
	Class isa;
}
/*
一个isa指针占用8个字节
但是实际上NSObject在内存中开辟了16个字节

#import <objc/runtime.h>
查看实例对象成员变量所占用内存的大小
class_getInstanceSize([NSObject class]);

#import <malloc/malloc.h>
查看一个实例对象实际占用的内存大小
malloc_size((__bridge const void *)obj);

*/

在这里插入图片描述

objc指向的地址,就是isa的地址
在这里插入图片描述

如果一个student继承NSObject,并且有自己的两个成员变量
请添加图片描述
此时student内存大小为isa(8)+int _no(4) + int_age(4)=16字节
如果只有一个成员变量isa + int = 12,此时12小于16,系统会默认分配16字节
stu的内存地址也就是isa的内存地址

二、OC对象的分类

1.instance对象(实例对象)

请添加图片描述

2.class对象 (类对象)

请添加图片描述

注意:object_getClass,
不是:objc_getClass

3.meta-class对象 (元类对象)

请添加图片描述

汇总

object_getClass(),如果传入实例对象,那么返回的就是类对象
如果传入类对象,那么返回的就是元类对象
如果传入元类对象,那么返回NSObject(基类)的meta-class对象

请添加图片描述

实例对象中存放的一个isa,还有其它成员变量的值(注意是值)
类对象中存在,isa , superclass,成员变量(类型(int),名称(age)),属性信息,对象方法(-号方法),协议
元类对象存在, isa, superclass,+号方法

注意:

这样不能获取元类对象
Class objectClass2 = [[object2 class] class]

三、isa和superclass指针

isa指针
请添加图片描述
请添加图片描述

实例对象的isa指针,其实就是指向class对象内存地址
class对象的isa指向meta-class的内存地址,也就是相等的关系
但是从64bit以后,isa指针需要进行一个运算才能得出相等的关系,上图所示

superclass指针
请添加图片描述
meta-class 的superclass
请添加图片描述
请添加图片描述
请添加图片描述
窥探struct objc_class的结构
请添加图片描述

四、面试题 – 面向对象

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值