OC底层实现_准备知识_02

(一)关于64位

只了解内存相关的知识点,64bit就是8个字节,所以内存地址编号范围用16进制表示就是0x00 00 00 00 00 00 00 00 ~ 0x FF FF FF FF FF FF FF

#import 

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
             // 创建NSObject对象
        NSObject *obj = [[NSObject alloc] init];
        
        //打印
        NSLog(@"%@", obj);
        NSLog(@"obj指向NSObject对象的地址:%p", obj);
        NSLog(@"obj变量的地址:%p", &obj);
        
    }
    return 0;
}

如上图代码,obj是指针,obj中值是NSObject类实例对象的地址,
因为是64位寻址空间,所以obj需要8个字节的空间.对obj使用取地址符&,得到的是obj变量的地址.

[NSObject alloc] 这句代码就是让系统分配一段NSObject类需要的内存空间,然后把这段内存空间的首地址编号返回, 后面调用init方法,
按字面理解就是初始化,依然返回的是alloc分配内存空间的首地址编号.

对象的地址,就是对象的内存空间的首地址,这是为了方便表述.如果还是认为不好理解,就回想数组的情况,数组的地址就是数组第0个元素的地址.

(二)逐步验证,使用Xcode提供的View memory工具

1.如下图在工程中设置断点

设置断点,运行程序.png

2.查看log打印,得到两个地址

运行结果,得到了2个地址.png

3.复制obj变量的地址:0x7ffeefbff508(只复制16进制数据)

然后点击菜单命令:Debug -> Debug Workflow -> View memory 打开新的对话界面


点击菜单命令.png

4.粘贴地址在新打开的对话界面Address输入框中,并按下Enter

查看内存数据.png
PS:这段内容非常重要,不能清晰理解的小伙伴,务必要多尝试理解一下,本质就是C语言的指针.
后面要计算类对象需要的内存大小,还有一个是系统实际分配的内存大小,指针理解不透,肯定会一脸懵逼.

你可能感兴趣的:(OC底层实现_准备知识_02)