ios 底层源码 calloc流程

126 阅读1分钟

在ios底层中,我们发现我们申请的内存大小跟返回的不一样,比如

@interface ZJPerson : NSObject
@property(nonatomic, copy)NSString * name; // 8
@property(nonatomic, assign)int age;      // 4
@property(nonatomic, assign)float weight;  // 4
@end
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    ZJPerson* per = [ZJPerson alloc];
    
    NSLog(@"%zu---%lu",class_getInstanceSize([per class]),malloc_size((__bridge const void *)(per)));
}

这段代码的输出结果是

24---32

我们先看下常用数据类型在内存中占用大小:

屏幕快照 2019-12-19 上午11.00.26.png
由于NSObject底层是一个结构体指针,

@interface NSObject <NSObject> {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-interface-ivars"
    Class isa  OBJC_ISA_AVAILABILITY;
#pragma clang diagnostic pop
}
typedef struct objc_class *Class;

因此我们简单推算出 ZJPerson所占的内存大小为 8 + 8 + 4 + 4 = 24, 那为什么实际申请的时候,却返回了32呢,我们看下alloc流程图

未命名文件 (3).png
可以看出,在申请过程中,进行了16字节对齐,那为什么要16字节对齐呢? 下篇文章进行底层对齐的分析