在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
我们先看下常用数据类型在内存中占用大小:
@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流程图