说到Object-C最深的理解应该是万物皆对象。所以底层最开始研究的应该是Object-C的对象。
那么Object-C到底是如何生成对象的的?答案当然是:
[[NSObject alloc]init]
[NSObject new]
但是如果你以为是这么简单那你就大错特错了,作为研究底层的人员来说,如果做不到了解它的原理构造那么你就"浅薄"了
所以我们先赶紧来了解一下Object-C中[[NSObject alloc]init]
[NSObject new]
的原理吧
alloc原理
当对象调用alloc
方法时
根据源码分析可知会进入系统_objc_rootAlloc
方法
再跟方法会进入到callAlloc(cls,false/*checkNil*/,true/*allocWithZone*/)
系统会在callAlloc
方法中进行一次判断(非首次)
通过后进入_objc_rootAllocWithZone
再进入到_class_createInstanceFromZone
方法进行内存大小计算
、开辟内存空间
、绑定对象和isa
init原理
系统init
实际上只是将self
直接返回了
其是工厂化设计
。方便我们对init
进行重写
,代码重构、可操作度大大提升
new原理
new
实际上就是[[cls alloc]init]
实际并没有什么不同只是封装到了一起后没有办法单独的重写init
会有一点点操作受限的缺点
tips
当我们对象调用alloc
方法时,实际上系统会走两次objc_alloc
方法。而[NSObject alloc]
会走一次的原因是因为系统在刚刚编译的时候就有其子类NSArray
初始化的时候走过一次。
那么为什么会走两次呢?
是由LLVM
在编译时将所有的alloc
方法拦截后先走一次objc_alloc
方法,判断为false
后,重新Call
正常的alloc
方法
为什么苹果系统要拦截alloc
走objc_alloc
,判断为false
后重新走一次alloc
?
据老师回答为优化细节,特殊方法(调用次数量很多)。中间处理层,方便监控处理、统计、调控。
在这个问题上还是一知半解,如果有人知道的话请给我解答疑惑。
Object-C|对象原理(中) |
---|