- 對象的屬性以8字節(jié)內(nèi)存對齊, (alloc)對象以16字節(jié)對齊
- 任何一個對象都有自己的 isa, 內(nèi)存占8字節(jié), 如果是8字節(jié)對齊的話, 對象之間 isa 都是緊鄰的, 沒有一點空隙, 如果內(nèi)存訪問出現(xiàn)了一點錯誤或者偏移, 就會訪問到其他對象, 就會出現(xiàn)一些野指針,內(nèi)存訪問錯誤之類, 發(fā)生了混亂, 所以為了使得對象之間的訪問更加的安全, 就需要給對象之前預(yù)留一部分的空間, 預(yù)留多少合適呢, 毫無疑問, 當(dāng)然是8字節(jié), 為什么不是1,2,4字節(jié)呢? 一方面16字節(jié)是可以占用最小空間的合理內(nèi)存空間, 即8的倍數(shù), 另一方面也更加的安全, 各個對象的內(nèi)存都是16字節(jié), 偏移和訪問時, 可以很好地進(jìn)行對齊.
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface LGTeacher : NSObject
// class isa 8字節(jié)
@property (nonatomic, copy) NSString *name; // 8字節(jié)
@property (nonatomic, assign) int age; // 4字節(jié)
@property (nonatomic, assign) long height; // 8字節(jié)
@property (nonatomic, strong) NSString *hobby; // 8字節(jié)
// 總計 36字節(jié) 因為對象屬性以8自己對齊, 36+(4) = 40
@end
NS_ASSUME_NONNULL_END
初始化對象,并獲取對象的內(nèi)存 size:
LGTeacher *p = [[LGTeacher alloc] init];
p.name = @"LG_Cooci";
p.age = 18;
p.height = 185;
p.hobby = @"女";
// 總計36字節(jié) class_getInstanceSize()
// class_getInstanceSize() 獲取屬性的內(nèi)存, 根據(jù)8字節(jié)內(nèi)存對齊為36
// malloc_size 獲取對象的內(nèi)存 根據(jù)16字節(jié)內(nèi)存對齊為48
NSLog(@"%lu - %lu",class_getInstanceSize([p class]),malloc_size((__bridge const void *)(p)));
打印結(jié)果: 40-48
-
NSObject對象的內(nèi)存
NSObject對象的內(nèi)存地址 - 原文地址
博客