先来一个耳目一新的回答:
什么是 runtime(运行时)?
是由c,c++,汇编实现的一套api,是为了c进化到oc添加的运行时功能
再来先看下边的代码,p,p1,p2 的地址是否一样?
![](https://img.haomeiwen.com/i14771483/41fa55ff0ca00909.png)
答案是一样!!!why?
带着这个疑问,让我们先看看alloc 方法的底层实现。
在objc 源码里边可以看到alloc方法调用顺序
![](https://img.haomeiwen.com/i14771483/16149ead422959f9.png)
在xcode的寄存器里边跟进_class_createInstanceFromZone 里边去,打印x0寄存器,得到Person 的值,说明person对象已经初始化成功了;what?那init 干什么了啊,毛都不干,还调用它干啥?
带着这个疑问,我们再来看init 的源码
![](https://img.haomeiwen.com/i14771483/82bdd4e6581c8841.png)
直接返回了传进来的对象…. 我有一句mmp 不知当讲不当讲,苹果爸爸为啥么要这么做呢?
其实这是苹果的一种设计模式(工厂模式),父类什么都不干(object),把所有的权限都给了子类(person),子类(person)可以自定义init方法,那么再次初始化person 类,就会直接走你自己的init 方法(init 方法里边可以赋值等等的各种操作)—为了自由(不是部落【偷笑】)
那么 使用 new 来初始化对象呢?然我们看一下new的源码
![](https://img.haomeiwen.com/i14771483/87f72b27d0c4d9ed.png)
和 alloc一样的走了 callAlloc 方法,然后直接调用init 方法;这说明了什么?说明new 和 alloc + init 效果是一样的,不一样的地方只是 alloc + init 这种模式可以自定义init 方法,new 这种只能使用系统默认的init 方法。
那么让我们再分析一下 _class_createInstanceFromZone 方法里边大概干了什么?(主要是234步骤)
![](https://img.haomeiwen.com/i14771483/fab5358cc862e101.png)
对齐算法 常用实现(以8 位为例)
![](https://img.haomeiwen.com/i14771483/5868f5e90dadc196.png)
获取类大小的时候是以8字节对齐,而分配内存的时候又以16位对齐,那么让我们看一下具体的表现:
![](https://img.haomeiwen.com/i14771483/059611fcc8857693.png)
![](https://img.haomeiwen.com/i14771483/7bae78a0039a5c91.png)
网友评论