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.png

8字节对齐

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;
}

什么都没有做(给我们留一个口子 重写)

上一篇下一篇

猜你喜欢

热点阅读