runtime底层之init的底层探究

之前心血来潮突然想再从头再研究下runtime底层的东西,顺便写一些runtime底层的文章,不仅希望给小白一些贡献,也希望再加深自己的印象,所有文章不含任何复制粘贴成分,参考大牛博客不可避免,但还是希望自己可以做到自己组织语言去原创。因为本人文字基础有限,含羞的写了一篇关于alloc底层的文章,说了alloc就不得不说一下init的底层了,一起来探究吧。

首先,还是先创建个Person类,然后再init处打上断点:

Person *obj = [Person alloc];
Person *obj1 = [obj init];

此时断点断在了init这一行,然后再给init打个符号断点,接下来会进入init的汇编代码:
image1.png

此时会发现init的实现调用的是libobjc的动态库,接下来打开objc源码,找到init的方法实现:
image2.png

这里会调用一个_objc_rootInit方法,继续点进去:
image.png

进去之后会发现_objc_rootInit方法竟然什么都没做,直接就把对象返回了,那看完实例方法再看看init的类方法实现类什么?
image3.png

init的类方法也是什么都没做直接返回self,由此可以判定init的实现本身不具备任何功能;但是苹果为什么要用它呢?当然苹果不会那么傻,把一个没有用的方法拿来用,其实这是一种设计模式,我们一般会在重写里用到init,其功能就是做一些默认初始化操作:

- (instancetype)init{
    self = [self init];
    if (self) {
        
    }
    return self;
}

所以init的使用还是根据你的需求是否需要重写初始化来决定要不要写,其实对象在alloc的时候已经创建出来了。

你可能感兴趣的:(runtime底层之init的底层探究)