美文网首页
Objective-C对象(一)

Objective-C对象(一)

作者: mayuee | 来源:发表于2021-06-17 13:31 被阅读0次

一个NSObject对象占用多少内存

  1. Objective-C的面向对象都是基于C\C++的数据结构实现的。
    Objective-C对象的本质是一个结构体,只有结构体才能容纳不同类型的成员属性。
  2. 编译 .m 文件

在main.m中

        NSObject *object= [[NSObject alloc] init];

编译

 *xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp*
NSObject底层实现
  1. NSObject底层实际是一个结构体,包含一个Class类型的 isa
  2. Class 实际是一个结构体指针
  3. 指针类型在32位系统4个字节,64位系统则为8个字节
NSObject *object= [[NSObject alloc] init];
//获取 NSObject 实例对象的成员变量所占的大小,实际利用内存
NSLog(@"%zd", class_getInstanceSize([NSObject class]));
//获取 object 指针所指向的内存大小,系统实际分配内存
NSLog(@"%zd", malloc_size((__bridge const void*)object));

//输出
22:15:41.512640+0800 First[1556:45323] 8
22:15:41.515220+0800 First[1556:45323] 16
  1. 一个NSObject对象创建时系统分配了16个字节内存,但NSObject内部只利用了8个字节


    Student继承Person
Cocoa框架规定一个Object最低16个字节
  1. Person的NSObject指针(Class isa)占用8个字节,成员变量_age占用4个字节,内存对齐Person分配16个字节,实际利用12个字节
  2. Student的Person指针占用16个字节,_no追加到Person空余的4个字节,所以此时Student还是占用16个字节
  3. 当Student中再添加一个 成员变量int _sex;时,需要分配新的内存空间,虽然_sex只有4个字节大小,但根据结构体内存对齐,16*2,此时Student占32个字节

结构体的大小必须是最大成员大小的倍数
iOS操作系统内存对齐,都是16的倍数
()是运算符,在编译时执行,根据des类型编译成一个常量,int des, sizeofprint(@"%d", sizeof(des))编译时实际是print(@"%d", 4)

对象销毁

对象销毁

object_dispose里面调用下面方法


image.png image.png

为什么实例对象里面只存储了成员变量没有存储方法列表

方法存储一份就够了。
sizeof()编译的时候就确定了,是一个运算符

相关文章

网友评论

      本文标题:Objective-C对象(一)

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