美文网首页
runtime底层之init的底层探究

runtime底层之init的底层探究

作者: AndyLLLL | 来源:发表于2019-02-21 12:36 被阅读0次

    之前心血来潮突然想再从头再研究下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的底层探究

          本文链接:https://www.haomeiwen.com/subject/rgcryqtx.html