在iOS开发中,我们使用OC对象来进行编程,本篇文章我们一起来探讨OC对象是如何初始化的。
在这里,我们使用的版本信息如下:
Mac OS: 10.15.6
Xcode: 11.3.1
OC开源库:objc4-781.tar.gz
接下来,我们会根据源码进行调试。
分析
我们对NSObject进行初识化,并且在初始化的位置处设置一个断点 OC1.png- 1,在 alloc 方法处设置一个断点
- 2,当断点触发时,点击
step into
,跟进该方法。
当我们跟进 alloc
方法后
会继续 调用
callAlloc
函数,allocWithZone
参数需要注意下,这里传的是 false
。然后在点击
step into
image.png
我们在每一个 return 处设置一个断点,并点击 continue
,会直接调用 _objc_rootAllocWithZone
,我们进入到该函数
我们可以看出,该函数直接返回
_class_createInstanceFromZone
函数的返回值,OC5.png
-
1,
instanceSize
用来计算该对象所需的内存空间大小,当 size < 16时,分配16字节空间。当 对象所需内存大于16时,则分配(x + size_t(15)) & ~size_t(15)
(16的整数倍)的空间。 -
2,计算出对象所需的空间后,调用
calloc
函数申请 size大小的空间,并返回空间的地址值。 -
3,
initInstanceIsa
关联到相应的类。
这样的话,就完成了一个对象的初始化。
总结:
NSObject对象初始化的过程基本流程如下:
OC6.png
网友评论