alloc底层原理分析-02 申请内存 字节对齐
2021-01-13 本文已影响0人
扫地僧练级
接着上一篇说:
思考对象需要开辟多少内存空间?(存放成员属性 本身有NSObject的)
断点一步一步进入:
image.png
让没有字节对齐的让字节对齐:
image.png
uint32_t unalignedInstanceSize() const {
ASSERT(isRealized());
return data()->ro()->instanceSize;
}
data()->ro() dyld映射文件加载的时候加载的是data数据段,有一个ro属性,这个是类对象的属性
image.png8字节对齐
word_align这个算法就是8字节对齐的算法,因为指针的大小是8字节,所以这个算法返回8的倍数(对象内存空间是8的倍数 - 8字节对齐)
// 8 + 7 == 15
// 0000 1000 8
// 0000 0111 7
// 0000 1111 15
// 1111 1000 ~7
// 0000 1000 15 & 7 = 8
// 任何一个数先保证能至少升到8(0000 1xxxx),剩下的x都抹掉(升对齐)
验证:对象属性在内存中的布局
方式1
lldb
@interface Person : NSObject
@property (nonatomic) NSString *sex;
@property (nonatomic) NSInteger age;
@property (nonatomic) long height;
@end
Person *p = [[Person alloc] init];
p.age = 18;
p.sex = @"男";
p.height = 198.0f;
image.png
解释一下:
0x10072bca0:起始的isa
iOS:小端,倒着读
x/4xg:读四段
第一个是isa:0x001d800100002295
第二个是sex:0x0000000100001030
第三个是age:0x0000000000000012
第四个是height:0x00000000000000c6
方式2
查看整个内存
image.png image.png
现在回答一下之前的问题,看源码:
size_t size = alignedInstanceSize() + extraBytes;
// CF requires all objects be at least 16 bytes.
if (size < 16) size = 16;
return size;
可以看到至少开辟了16字节(为了安全,防止越界)
init方法做了什么呢?
- (id)init {
return _objc_rootInit(self);
}
_objc_rootInit(id obj)
{
// In practice, it will be hard to rely on this function.
// Many classes do not properly chain -init calls.
return obj;
}
什么都没有做(给我们留一个口子 重写)