配置objc源码
要学习,先要看底层源码是怎么回事儿,那就下载源码,调试查看。
从苹果官方opensource中可以下载到objc开源代码。经过配置,我们能够将这个源码执行到工程中去。
具体配置方法如下:
一、
![](https://img.haomeiwen.com/i5376790/0995989215943431.png)
二、
![](https://img.haomeiwen.com/i5376790/d60f29e6a7822647.png)
三、
![](https://img.haomeiwen.com/i5376790/02f48f015a54a72a.png)
四、
![](https://img.haomeiwen.com/i5376790/c8b8ed0aed8178e7.png)
五、
![](https://img.haomeiwen.com/i5376790/e43374cb342f6263.png)
六、
![](https://img.haomeiwen.com/i5376790/61bc654a66ecaba1.png)
七、
![](https://img.haomeiwen.com/i5376790/cacf74bcc054c3d4.png)
alloc底层原理
其实objc内部执行init方法时是发送一个alloc消息,这个消息的接受者是class
LGPerson:
![](https://img.haomeiwen.com/i5376790/2f8d36498b70d7e0.png)
然后,我们可以通过跟踪源码,找到alloc最后是会执行了NSObject alloc方法,通过查看x1寄存器知道,这个方法就是alloc方法。
![](https://img.haomeiwen.com/i5376790/1e8f5bc783787344.png)
通过代码流程发现,最后创建了这个对象,而这个对象就是最后返回的对象了。
![](https://img.haomeiwen.com/i5376790/ecef11ac67214b09.png)
alloc方法整个创建对象流程图:
![](https://img.haomeiwen.com/i5376790/dd1612b3c061ca05.png)
总结:其实alloc这个类方法当在调用的时候,内部已经创建了相应的实例对象,所以这个对象已经存在了。
既然alloc已经创建了对象,那么init方法干嘛了呢?
init方法底层原理
通过断点调试,同样发现这里是通过发送消息init执行的。
然后查看源码发现,init方法最后什么都没有做,只是将alloc创建的对象直接返回了而已!
![](https://img.haomeiwen.com/i5376790/fa09459e1a49fc7c.png)
所以这就是init方法最后干的事情,其实就是什么也没有干。
那么为什么苹果会这样设计呢,我们从NSObject的init方法中没有找到什么处理,那是因为他是NSObject。
还记得我们经常初始化一些类的时候,会重写init方法吗?
其实苹果留出来这个方法就是方便开发者,因为这个实例对象已经在alloc时存了,所以,当执行init的时候,可以给这个对象复制,属性初始化等等这个操作了,方便程序员在对象返回之前做一些想要做得事情。
网友评论