面试题:NSObject占用多少内存?

底层原理笔记:

1.oc中类的本质是c++中的结构体

2.clang -rewrite-objc main.m -o main.cpp 重写文件 -o输出 main.cpp新文件名字

模拟器(i386),32bit(armv7),64bit(arm64)

xrun -sdk iphoneos clang arm64 -rewrite-objc main.m -o main-arm64.cpp

3.NSObject *obj = [[NSObject alloc] init];

NSObject在内存中如下:

struct NSObject_IMPL {

Class isa; // 8个字节//isa是指向类对象的指针变量

};

结构体的地址就是第一个成员变量的地址;

 

// 获得NSObject实例对象的成员变量所占用的大小 >> 8

NSLog(@"%zd", class_getInstanceSize([NSObject class]));

// 获得obj指针所指向内存的大小 >> 16

NSLog(@"%zd", malloc_size((__bridge const void *)obj));

说明:NSObject实际上分配16个字节,但是只用了8个字节(isa变量只占用了8个字节,使用class_getInstanceSize可以查看)

oc对象最少要分配16个字节,objc4源码中有讲解

 

size_t class_getInstanceSize(Class cls)

{

if (!cls) return 0;

return cls->alignedInstanceSize();

}

 

size_t instanceSize(size_t extraBytes) {

size_t size = alignedInstanceSize() + extraBytes;

// CF requires all objects be at least 16 bytes.

if (size < 16) size = 16;

return size;

}

 

计算机大端小端模式:mac采用的是小端模式:从高位到低位读取数据;

大端是从低位开始读取;

 

内存对齐:结构体的内存大小必须是最大成员大小的倍数;

系统内存也有对其规则;

属性生成的setter,getter方法不在实例对象结构体的内存中,因为实例对象可能会有多个,所以方法只需要一份就好了,其他实例对象公用一个方法;

 

person->age;访问的是person对象的age属性;

person.age;访问的是age的setter方法或者是getter方法;

 

方法放在类对象的方法列表中;

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值