美文网首页
NSObject内存探索

NSObject内存探索

作者: 狼性刀锋 | 来源:发表于2018-08-05 14:30 被阅读12次

    NSObject内存探索

    对象的定义

    struct objc_object {
        Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
    };
    
    

    : 拥有isa指针的结构体都是对象,因此类也是对象(类对象),实例也是对象(实例对象)

    属于同一个类的实例对象的isa指针指向同一个类对象

    NSObject *aObject = [[NSObject alloc]init];
    NSObject *bObject = [[NSObject alloc]init];
    Class aNSObjectClass = [NSObject class];
    

    打个断点观察一下:


    memoryList.png

    这里可以看到其isa 指针都指向NSObject,但像我这样的还是喜欢看内存

    look memory operate.png ![allocation.png](https://img.haomeiwen.com/i2031664/10c5c5002e154c85.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    重复查看内存步骤,可以看到不同对象的isa指针确实指向同一块内存地址

    你也可以通过一下方法直接获取isa指针:

    Ivar ivar = class_getInstanceVariable([NSObject class], "isa");
    Class isa = object_getIvar(aObject, ivar);
    
    Class isa = [aObject valueForKey:@"isa"];
    

    ivar属于更底层的api, kvc则更偏向于上层,二者一一对应

    NSObject实例对象所占内存大小

    size_t NSObject_size =
            class_getInstanceSize([NSObject class]);
    

    通过上述代码获取实例对象size,其答案是8,查看上面的内存视图,你会发现这8个字节刚好是isa指针所占的8个字节,那么一个NSObject 实例对象就是8个字节大小吗,我写了段代码测试一下:

      for (int i = 0; i < 1000 * 1000; i++) {
          [[NSObject alloc]init];
        }
    

    上述代码在MRC模式下运行, 如果是8个字节的话,那么执行这段代码会增加8M的内存,可我通过观察发现其增长的内存接近16M,看起来更像占16字节。
    : 使用Xcode直接观察内存变化,只能得到一个大概的值。

    于是我使用Instrument Allocations 观察内存分配:


    allocation.png

    发现确实是16字节

    额外的8个字节去哪了

    这又是一个有趣的问题,最后查阅资料得到了答案: 原来在对象创建的时候,如果所占内存不足16字节,那么也会分配16字节

    探索一个NSObject对象占用多少内存?

    相关文章

      网友评论

          本文标题:NSObject内存探索

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