NSObject本质(二)继承体系中的实例对象占用多少个字节?

上一篇文章中,我们知道了一个NSObject对象,因为只有一个isa指针,在64位环境下系统分配了16个字节,但是实际只占用8个字节。这个可以分别通过malloc_size() 和 class_getInstanceSize()方法来获取。具体可以参看:一个NSObject对象在内存中占用多少个字节?

在实际开发过程中,我们用到的类都是继承自NSObject对象,那么一个继承自NSObject对象的实例对象究竟占用多少个字节呢?我们一起来探讨一下。

首先我们先创建一个命令行函数,构建一个继承体系,Student --> Person -->  NSObject,如图所示:

思考:现在Person的实例对象和Student的实例对象在64位环境下,分别占多少字节?

按照同样的方法,我们通过clang编译器将main.m函数转换成C++函数,在命令行中输入:

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

得到main.cpp函数,打开后,依旧搜索Person_IMPL和Student_IMPL,得到如下结果:

通过编译后的代码,我们也看到继承是如何实现的,Person类首先将其父类NSObject的成员变量继承过来,然后加上自己的成员变量。同样的道理,Student类先将其父类Person的成员变量继承过来,然后加上自己的成员变量。

首先我们来思考Person类,因为Person类中包含两部分,第一部分是NSObject的成员变量,也就是isa指针,第二部分是一个整形变量age。系统为NSObject分配了16个字节,isa指针只占用8个字节,age变量占用4个字节。那么age变量会不会在NSObject分配的16个字节的后8个字节中呢?如果是这样子的话,Person类的实例变量也就是占用16个字节内容。

同样的道理,Student类继承自Person类,按照刚才的假设,Person类分配了16个字节大小,实际占有12个字节,还有4个字节,刚好够整形score进行存储,实际是否是这样呢?

我们通过代码来验证一下:

结果和我们猜测的一样,Person类和Student类的实例都是分配了了16个字节,实际占用16个字节大小,也就是把NSObject剩余的8个字节充分利用了起来。

当然我们也可以像上篇文章中所讲的,通过探测内存布局,从侧面进行二次验证:

从内存布局中我们可以看到,系统分配了16个字节的连续空间,其中前8个字节是isa指针指向的地方,紧接着十六进制 0A 就是我们进行的age的值,十六进制96就是score的值。

这里牵涉一个大小端的问题,在iOS开发中所用的是小端模式,所谓的小端模式就是高位放在高地址,低位放在低地址,简称大大小小。大端模式刚好相反,高位放在低地址,低位放在高地址,简称大小大小。

由于地址从左至右依次增大,age的实际数值就是 0x0000000A = 10,score的值是0x00000096 = 150。

想进一步验证0x00000096是否是score的地址,我们也可以通过lldb调试器,来判断:

首先 student的地址是0x10040f430,向后偏移12个字节,也就是0x10040f43C,使用memory write 0x10040f430 10 将0x10040f43C的值改为0x10,修改完成后,查看score的值,变成了16,完美验证了我们的猜想。

到这里,关于继承体系中实例对象的内存布局,我们已经清楚了。总结一下:

   1.子类会继承父类的成员变量,然后将自己的成员变量紧挨其后;

    2.当父类中有剩余空间,能够存放子类的成员变量时,将子类的成员变量放在父类所开辟的空间后面,并没有分配新的内存空间。假如父类分配的内存空间已经占用满了呢?会发生什么情况,这个问题我们留到下篇文章进行分析,会牵涉到内存对齐的知识。

    3.大小端模式,iOS开发中用到的都是小端模式,即大大小小,高位放在高地址,低位放在低地址。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • 探寻OC对象的本质,我们平时编写的Objective-C代码,底层实现其实都是C\C++代码,如图所示: OC的对...
    二猪哥阅读 556评论 0 6
  • 面试题 一个 NSObject 对象占用多少内存? 系统分配了16个字节给NSObject对象(通过malloc_...
    叫我小黑阅读 556评论 0 0
  • 丛花香满溢, 微朵立枝依。 远影忽朦映, 新茵落彼宜。
    芝初阅读 294评论 0 2
  • 家庭主妇的愤怒 6年前妈妈的离世我就从单位下来不以工作状态的生活,开始很不适应,到处抓狂给自己安排...
    冷雪云阅读 148评论 0 1
  • 刚刚看到简书上的日更活动,想着参与一下吧,笔耕不辍,也是一种乐趣!可是45天这么久的日更,我要写点什么呢?...
    anna素语阅读 119评论 1 3