OC对象本质

  1. 对象的属性以8字节内存对齐, (alloc)对象以16字节对齐
  2. 任何一个对象都有自己的 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对象的内存


    NSObject对象的内存地址
  • 原文地址
    博客
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容