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的时候已经创建出来了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,157评论 1 32
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,824评论 0 9
  • 面试题参考1 : 面试题[http://www.cocoachina.com/ios/20150803/12872...
    江河_ios阅读 1,763评论 0 4
  • Redis基础 什么是Redis?Remote Dictionary Server(远程字典服务器)Redis是N...
    喝酸奶要舔盖__阅读 276评论 0 1
  • 【每日计划(早宣晚结)】 聚才国际LP3所向披靡;学员:潘饶平。 职务:CEO、事业总监、感...
    安吉88阅读 426评论 0 0