对于NSObject对象来说new的作用是为对象分配内存空间并使用init方法完成初始化,而与alloc&init这种显式写法来说不同的是,在分配内存空间的时候alloc相比于new来说会使用default_zone,从开放的objc运行时源码中的旧Object对象一窥NSObject的new实现
object.mm
NSZone原本是用于维护一块用于对象内存分配及释放的内存池的描述信息,进程默认的NSZone是在启动的时候创建并将随后所有的对象均分配在这里,也因此在做了大量的分配及释放对象内存之后,可能会产生很多的内存碎片,在做新的内存分配的时候NSZone会试图去填补这些碎片,即从碎片中找到合适的内存区块以存放新的对象,这个查找的过程是需要时间开销的。
所以如果需要在短时间内分配大量对象,则可以创建自己的NSZone,那么在分配对象内存的时候,只需要要当前zone的末尾分配即可,相比于去已经臃肿的default zone去分配这批对象,其耗时是更少的
但斯时已逝,像上面的Managing Zones的描述所说的,iOS及osx 64位运行时已经不支持自定义的zone了
所以不用纠结这东东了
好坏都跟咱没关系了
所以new与alloc&init的区别只剩下是显示调用还是隐式调用init的问题了,至于那个class_getVersion()是获取class的version这个其实可以自定义,一般自定义的class的version为0,但自定义的class,就算重载init其version也还是0,调用new的时候直接会进入init。其实这份object.mm已经是GNUC的遗留文件了,在objc体系中并未用到了,可以看到其已经通过ifdef !__OBJC2__这一步而将其定义抹去了