- 对象的属性以8字节内存对齐, (alloc)对象以16字节对齐
- 任何一个对象都有自己的 isa, 内存占8字节, 如果是8字节对齐的话, 对象之间 isa 都是紧邻的, 没有一点空隙, 如果内存访问出现了一点错误或者偏移, 就会访问到其他对象, 就会出现一些野指针,内存访问错误之类, 发生了混乱, 所以为了使得对象之间的访问更加的安全, 就需要给对象之前预留一部分的空间, 预留多少合适呢, 毫无疑问, 当然是8字节, 为什么不是1,2,4字节呢? 一方面16字节是可以占用最小空间的合理内存空间, 即8的倍数, 另一方面也更加的安全, 各个对象的内存都是16字节, 偏移和访问时, 可以很好地进行对齐.
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface LGTeacher : NSObject
// class isa 8字节
@property (nonatomic, copy) NSString *name; // 8字节
@property (nonatomic, assign) int age; // 4字节
@property (nonatomic, assign) long height; // 8字节
@property (nonatomic, strong) NSString *hobby; // 8字节
// 总计 36字节 因为对象属性以8自己对齐, 36+(4) = 40
@end
NS_ASSUME_NONNULL_END
初始化对象,并获取对象的内存 size:
LGTeacher *p = [[LGTeacher alloc] init];
p.name = @"LG_Cooci";
p.age = 18;
p.height = 185;
p.hobby = @"女";
// 总计36字节 class_getInstanceSize()
// class_getInstanceSize() 获取属性的内存, 根据8字节内存对齐为36
// malloc_size 获取对象的内存 根据16字节内存对齐为48
NSLog(@"%lu - %lu",class_getInstanceSize([p class]),malloc_size((__bridge const void *)(p)));
打印结果: 40-48
-
NSObject对象的内存
- 原文地址
博客