iOS OC中一个对象占用多少内存

554 阅读1分钟

一个NSObject对象占用多少内存

  • 一个NSObject占用了16个字节
  • 但是只使用了8个字节也就是 isa的大小 因为 isa是一个指针在oc 64位环境下 一个指针占用8个字节
  • 以为在ios中分配内存空间都是16的倍数 所以系统给了16个字节

查看方法

  • 查看使用多少的方法
    #import <Objc/Runtime.h>  
    class_getInstanceSize([NSObject Class])
    
    // 源码
    size_t class_getInstanceSize(Class cls) {
        if (!cls) return 0;
        return cls->alignedInstanceSize();
    }
    
  • 查看分配内存的方法
    #import <malloc/maslloc.h>  
    NSObject *obj = [NSObject alloc] init];
    malloc_size((__bridge const void *)obj);
    

通过查看源码证实

我们可以在openSource.apple.com 上下载最新的开源 源码 然后找到allocWithZone 通过这个方法的实现去证实以上结论

// 我们可以看到allocWithZone的实现就是
id
_objc_rootAllocWithZone(Class cls, malloc_zone_t *zone)
{
    id obj;

#if __OBJC2__
    // allocWithZone under __OBJC2__ ignores the zone parameter
    (void)zone;
    //再看这里的实现
    obj = class_createInstance(cls, 0);
#else
    if (!zone) {
        obj = class_createInstance(cls, 0);
    }
    else {
        obj = class_createInstanceFromZone(cls, 0, zone);
    }
#endif

    if (slowpath(!obj)) obj = callBadAllocHandler(cls);
    return obj;
}

id 
class_createInstance(Class cls, size_t extraBytes)
{
    // 继续往下找
    return _class_createInstanceFromZone(cls, extraBytes, nil);
}

// 重点是在_class_createInstanceFromZone 这个方法里

以上就是证明了