- 第一个内容:对象的内存对齐
创建了一个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