美文网首页
OC底层实现_准备知识_02

OC底层实现_准备知识_02

作者: 想象不到2019 | 来源:发表于2019-05-20 12:07 被阅读0次

    (一)关于64位

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

    #import <Foundation/Foundation.h>
    
    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

          本文链接:https://www.haomeiwen.com/subject/nlvhzqtx.html