一个NSObject 对象占用多少内存

在main.m 中初始化 NSObject 对象 Jump to Definition 可见类的定义
在这里插入图片描述
在这里插入图片描述

clang -rewrite-objc main.m -o main.cpp
编译一下生成C++文件可见
在这里插入图片描述
(IMPL 全称 Implementation 实现)

对比可发现 NSObject对象在内存中就是一个结构体
alloc 相当于分配存储空间给这个结构体

isa是啥 jump进去 发现是objc_class

在这里插入图片描述

objc_class 又是啥 继续jump

在这里插入图片描述

cache_t cache; 用散列表来缓存调用过的方法,可以提高访问方法的速度

在这里插入图片描述

_buckets 是个数组 

在这里插入图片描述

class_data_bits_t bits; 存储类的方法、属性、遵循的协议等信息的地方

在这里插入图片描述

好像跑题了 打住


main.m 中导入头文件
import “objc-runtime.h”
import < malloc/malloc.h >
因为即将使用到两个函数

  • class_getInstanceSize(Class cls)获取NSObject 实例对象的成员变量至少需要的空间大小
    在这里插入图片描述
    在这里插入图片描述
Class's ivar size rounded up to a pointer-size boundary.
类的ivar大小四舍五入为指针大小边界。
    
word_align(unalignedInstanceSize());
这里传入一个未内存对齐的值 然后返回一个做过内存    对齐的值的大小         
  • malloc_size(const void *ptr);
    获取指针对象大小

在这里插入图片描述

也就是说 实际给分配了16个字节 但实际上只用来8个

来看一下 alloc 的实现
在这里插入图片描述
来看下allocWithZone 的实现
在这里插入图片描述
继续 Jump
在这里插入图片描述
发现一个创建实例对象方法 继续Jump
在这里插入图片描述
在这里插入图片描述
这有个初始化函数calloc 传入size 再看size
在这里插入图片描述

CF requires all objects be at least 16 bytes
CF要求所有对象至少为16字节
也就是如果小于16全部都设定为16

###综上所述
系统分配了16个字节给NSObject对象
但是只有8个字节被使用

稍微复杂一丢丢的对象

直接上代码
在这里插入图片描述

这个虽然一眼就能看出结果,但是为了日后看着方便还是记录一下过程

在这里插入图片描述

之前的isa 8位 int 分别占4 位 也就是现在一共 16位 iOS 属于小端 所以读书从高往低读

0x0000001   0x0000002 而不是 0x04 0x05
基础知识 关于大端小端 重温一下
1.大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
2.小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。

直接找Brother_IMPL 这个实现
在这里插入图片描述

包含父类结构体的实现 NSObject_IMPL

在这里插入图片描述
Brother 继承自 NSObject NSObject_IMPL结构体中只有一个isa 所以还是8个字节

#更复杂一些有继承关系的
在这里插入图片描述

脑补一下clang 之后结构体
在这里插入图片描述
NSObject
在这里插入图片描述
父类的 8+4 = 12
内存对齐: 结构体大小必须是最大成员大小的倍数 也就是16的倍数 <16 0来补齐
define NANO_MAX_SIZE 256 /* Buckets sized {16, 32, 48, 64, 80, 96, 112, ...}
所以16的倍数


子类的

struct Brother_IMPL {
	struct Dad_IMPL Dad_IVARS;  16
	int _ba;  4
};
16+4 = 20
为啥还是16  因为父类 16其中有4个是空白的
所以直接填充进去了

谨以此做为学习记录之用,如有错误请指出非常感谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值