曾经面试过一个大牛,从金山出来,到京东金融。简历送到我面前的时候,感觉他就是夜空中最亮的星。在面试过程中,记忆犹新的就是问了一个关于 object-c对象,alloc init 的原理以及和new 的区别。我记得很清楚他的回答:alloc init 和new 最后都是malloc 实现的。对于这一回答我抱着谨慎的科学的态度告诉他,这个我没有验证过,你也可以下来可以通过LLDB、汇编分析、以及从苹果官网下载libObjc.dylib,下载源码,分析一下对象初始化流程。
当然,接下来我也去验证了这个问题,首先我去下载了libobjc的源码、https://opensource.apple.com/release/macos-1014.html。
下载下来解压后,build会有error、缺失头文件,以及编译选项的配置,参考:https://www.jianshu.com/p/28150fa0c085。
如果我们在自己的工程中 command + 点击 alloc,我们回跳到这样一个页面,
这是系统sdk的头文件,点击方法没法跳进去,我们只看到表象,而得不到我们想要探究的实质。但是我们有了objc的源码,情况就不一样了,我们可以跟踪进去看个究竟。这就是人类强大好奇心的驱使,做技术要常怀好奇心、激发好奇心,这是一种能力。
从这里开始有两个分支,一个是初始化isa,一个是创建一个实例createInstance。
再往里面跟踪,我们回总结出来一个这样一个alloc的内部实现流程。
接下来,我们再看看init的实现、
_objc_rootInit 竟然直接返回了 obj,里面什么也没有做。那init还拿来干嘛呢,这是抽象工厂设计模式。
我们自定义一个对象,定义他的属性,在它初始化的时候,它就有一些默认值,比如,占位图、占位字符,我们需要重写init方法,在它的初始化方法中,给这些属性赋值。这就是init的作用!