alloc探究(一)

266 阅读1分钟

1.在创建对象时一般使用 [[NSobject alloc] init]来创建对象,问创建对象过程中的alloc 和 init 分别做了些什么?

  1. 我们分别创建3个NSObject对象 如下图方式创建 打印结果这3个对象为同一个对象
  2. 我们再打印这3个对象的地址,发现3个地址指向的为同一个内存空间
  3. 可见 alloc 已经创建了对象 那么 alloc 是怎么创建的对象呢?
    我们右键跳转跟踪进去
    到此发现,已无任何源码实现,无法窥探alloc是如何创建的。

2.如何窥探alloc到底如何创建对象?

  1. 代码下断点探究,按住control键,点击图中箭头所指方向点击多次可进入 objc_alloc 方法

    此时继续走会发现进入一个 pushq jmp的循环
    此时可放弃,同样的操作使用真机调试,发现来到 objc_alloc方法 接着来到 libobjc.A.dylib动态库里 _objc_rootAllocWithZone 然后到了 objc_msgSend方法


  1. 下符号断点(Symbolic Breakpoint)探究 先下个alloc符号断点进入
    点击in 会进入objc_alloc libobjc.A.dylib动态库里 _objc_rootAllocWithZone 然后到了 objc_msgSend方法
    这样一直in下去

  1. 汇编探究
    点击Debug->Debug Workflow 选中Always Show Disassembly
    可看到objc_alloc 打断点 Control+in 继续走可进入libobjc.A.dylib动态库里

  1. 利用objc4-756.2源码分析