object-c 对象内存分配

 

@interface BusinessCard2 : NSObject
@property (nonatomic) int _age;
@property (nonatomic) Byte _padding; //放在这里会让对象分配内存空间时多分16字节=》alloc(32字节)
@property (nonatomic, retain) NSString *_firstName;
@property (nonatomic) Byte _b1;

@end;
@implementation BusinessCard2

- (void)dealloc{
    [__firstName release];
}
@end

 

测试:

    BusinessCard2 *card2 = [[BusinessCard2 alloc] init];
    card2._firstName = @"adfadsfds";
    NSLog(@"===BusinessCard2 size==%d", malloc_size(card2));

 

分析:对象实例初始化后,在内存中格局如下:

实例对象预留 (4字节)   +  age(int 4字节) + byte(1字节,以及系统内存对齐要补全的3字节) + nsstring(*指针4字节) + 3个byte(3字节)     ==》sum(17字节),但因为对象分配内存按16字节增加,所以补充成32字节。

 

如下用下面方式:

@interface BusinessCard2 : NSObject
@property (nonatomic) int _age;
@property (nonatomic, retain) NSString *_firstName;
@property (nonatomic) Byte _padding; //如放在这里的话,因为内存分配对齐的原则,仅分配16字节=》alloc(16字节)
@property (nonatomic) Byte _b1;
@property (nonatomic) Byte _b2;
@property (nonatomic) Byte _b3;
@end;
@implementation BusinessCard2

- (void)dealloc{
    [__firstName release];
}
@end

 

实例对象预留 (4字节)   +  age(int 4字节) + nsstring(*指针4字节) + 4个byte(4字节,因为相联,所以用4字节存储,不再考虑内存对齐问题)     ==》sum(16字节)。

补充:short分配为2(字节)

因为object-c中使用的都是指针类型实例对象,所以全部为4字节。但如果像上面例子使用了基本C的类型,就要考虑内存对齐的问题了。

 

 

posted @   代震军  阅读(1700)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2008-05-29 推荐一个基于Microsoft ASP.NET MVC Preview 2 的应用示例
2008-05-29 DinnerNow中的Work Flow应用(下) --- 订单流程
点击右上角即可分享
微信分享提示