陷入回忆: 还记得刚去面试的时候,面试官问道:讲一下alloc 都做了什么,记得那个时候支支吾吾的说,在内存里面开辟了空间,创建了对象,并拿到对象的指针。这明显就是对内容不太了解。最近有一些空闲,那就研究研究这个alloc 到底是干了什么。
cocoa1、直奔主题,去查找alloc
项目中的alloc点击以后发现,根本没效果,看不到里面,苹果并没有把对应的实现暴露出来,这怎么难的到我们呢,https://opensource.apple.com,去这个网站找一找,发现 苹果给了这部分的源代码,下载下来研究一下吧!
下载它就好啦刚下载下来以后是不可以用的,还需要配置,网上有对应的教程,这里就不啰嗦了。
2、在源代码中分析,源码是C/C++ 来编写的,所有好多文件名称是.mm
alloc方法我们直接搜索 ”alloc {" 拨云见日,小家伙,终于让我们找到你的真身了。封装的层数还挺多的,我们来顺藤摸瓜一下,看看它到底几层禅师几层关。
1、层
_objc_rootAlloc(Class cls)2、层
callAlloc3层
_objc_rootAllocWithZone4层
_class_createInstanceFromZone抽丝剥茧 终于看到了它的本来面目,我们看到了这个instanceSize 可以猜到这是一个关于内存大小的属性,我们去探一探,
发现核心代码:
cls-> instanceSize 计算开辟空间,并对空间进行 8 字节和16字节对齐
calloc 去申请内存
objc->initInstanceIsa 初始化isa 指针,关联到相应的类
总结:今天先探讨到这里,从源代码中可以看的到,我们调用的OC 中alloc 其实在底层 主要是做了三件事,1、计算开辟需要的空间 2、去申请内存 3、初始化isa 指针
网友评论