在Object-C里,alloc/init和new两种写法都可以做到分配内存空间并初始化实例。看起来alloc/init好像就是将new的分配空间和初始化分开了(alloc用来分配内存空间,init用来初始化实例变量)。那么两者到底有什么区别呢?
可以看出,两种方式基本上一致。区别上从_alloc和_zoneAlloc中可以看出,new使用了zone,它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度。
但如果使用new的话,初始化方法被固定死只能调用init.不能再使用init开头的其它初始化方法,据说最初的设计是完全借鉴Smalltalk语法来的,传说那个时候已经有allocFromZone:这个方法,只是给对象分配了内存,并没有初始化实例变量,但是这个方法需要传个参数id myCompanion = [[TheClass allocFromZone:[self zone]] init];
这个方法像下面这样:
并且allocFromZone:在苹果文档上已经说明,这个方法是因为历史原因所存留,它的参数zone可以直接无视,已经不再在object-c上使用,也不需要再重写这个方法。
官网的说法,alloc方法即使重写也不要写任何初始化的操作,它其实也调用了allocFromZone。