对象底层原理

166 阅读1分钟

对象底层原理(上)


一. 初探 alloc


    LGPerson *p2 = [p1 init];

    LGPerson *p3 = [p1 init];

    LGNSLog(@"%@ - %p - %p",p1,p1,&p1);

    LGNSLog(@"%@ - %p - %p",p2,p2,&p2);

    LGNSLog(@"%@ - %p - %p",p3,p3,&p3);
<LGPerson: 0x600002a14490> - 0x600002a14490 - 0x7ffee8651098

<LGPerson: 0x600002a14490> - 0x600002a14490 - 0x7ffee8651090

<LGPerson: 0x600002a14490> - 0x600002a14490 - 0x7ffee8651088

alloc.png

  • alloc
    • 在堆内存中开辟内存空间.
  • "%@"和"%p"占位的区别
    • "%@"打印类型,和description 方法打印对象地址.(堆中的对象地址堆)
    • "%p"打印对象的地址.(堆中的对象地址)
    • "%&p"打印指针的地址.(栈中的指针地址)
  • 栈内存(指针对象地址)是连续的相差 8 字节
    • 栈对象为什么是 8 字节, 一个对象是一个结构体, 一个结构体是一个指针就是 8 字节.
    • 连续往下开辟

alloc 是怎么开辟内存的

  • 符号断点
    • 加 alloc 符号断点

      • "alloc" + setep over单步调试,会找到libobjc.A.dylib +[NSObject alloc]:
      • setep into单步调试进入子函数,会找到jump _objc_rootAlloc
    • 加符号断点 objc_alloc(无效)

      • 没有符号断点, 需要 ctr + step into,会找到'objc_alloc'
      • 函数调用栈加'objc_alloc'观察能发现源码路径'libobj.A.dylib.'
    • 查看汇编

开辟内存.png

对象的内存空间和分布都是由属性影响.

  • 内存对齐.