0
点赞
收藏
分享

微信扫一扫

OC对象分析-内存对齐

云上笔记 2021-09-19 阅读 78
iOS进阶
  • 第一个内容:对象的内存对齐
    创建了一个Person类,代码如下:
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *nickName;
@end

NS_ASSUME_NONNULL_END

Main函数里打下断点,在alloc后打印下person


可以看到0x00000001061bf598即为isa的地址,0x6000027687a0为对象存放的起始地址。接着往下走,属性赋值后再次打印


给Person增加几个属性

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *nickName;
@property (nonatomic, assign) int age;
@property (nonatomic, assign) long height;

@property (nonatomic) char c1;
@property (nonatomic) char c2;


@end

赋值走断点打印下属性

可以看到age、c1、c2并没有像name独立一个地址,而是三个一起占了8个字节,这里age 4个字节,c1和c2分别是1个字节,加起来共6个字节,然后字节补齐占了8个字节,这样做自然是为了节省空间。

  • 如果把height类型改成double类型会怎样呢?结果发现完全找不到height的值。


开始时推测0x4066800000000000放的就是180.0,但是打印下发下不是。这是因为double和float是特殊处理的,其实0x4066800000000000放的就是180.0。打印下180.0的16进制,就是0x4066800000000000

  • 内存对⻬的原则

这里举例2个struct

struct Struct1 {
    double a;   // 8 (0-7)
    char b;     // 1 [8 1] (8)
    int c;      // 4 [9 4] 9 10 11 (12 13 14 15)
    short d;    // 2 [16 2] (16 17)
}struct1;

// 内部需要的大小为: 17
// 最大属性 : 8
// 结构体整数倍: 24
struct Struct2 {
    double a;   //8 (0-7)
    int b;      //4 (8 9 10 11)
    char c;     //1 (12)
    short d;    //2 13 (14 15) - 16
}struct2;
// 15 -> 16

那么struct嵌套struct呢,应该是两个struct大小的和 24+ 16 = 40

struct Struct1 {
    double a;   // 8 (0-7)
    char b;     // 1 [8 1] (8)
    int c;      // 4 [9 4] 9 10 11 (12 13 14 15)
    short d;    // 2 [16 2] (16 17)
     struct  struct2; // 8 [18  8] 18 19 20 21 22 23 (24 25 ... 从24开始16个字节)
}struct1;

struct Struct2 {
    double a;   //8 (0-7)
    int b;      //4 (8 9 10 11)
    char c;     //1 (12)
    short d;    //2 13 (14 15) - 16
}struct2;
// 15 -> 16

举报

相关推荐

0 条评论