alloc:分配内存。init:初始化。
new:代替上面两个函数:分配内存,并且初始化。
上代码
【 Summary 】:
0. 在实际开发中很少会用到new,一般创建对象时我们一般是 [[className alloc]init];
1. 区别只在于alloc分配内存的时候使用了zone它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的内存,提升了程序处理速度。
2. 不推荐使用new:原因是使用new的话,初始化方法被固定死只能使用init,不能调用其他的initXX方法。
3. 采用new方法只能采用默认的init方法完成初始化,采用alloc的方式可以用其他定制的初始化方法。
4. new方法其实内部调用了init方法,很显然在调用之前还分配了内存
5. [class_name alloc] init]在alloc的时候调用了allocWithZone分配了内存,而new只是进行了 alloc(这里的alloc是内存分配的意思,不等价于alloc这个方法)。也就是说[class_name alloc] init] 实际上做了两步allocWithZone和init,而new是进行了内存分配,然后init;[class_name alloc] init] 分配的内存会和相关联的对象在内存地址中相靠近,利于内存读取。另外[class_name alloc] init]还可以自定义init方法比如像本文中的initWithHaha:
6. NSZone原本是用于维护一块用于对象内存分配及释放的内存池的描述信息,进程默认的NSZone是在启动的时候创建并将随后所有的对象均分配在这里,也因此在做了大量的分配及释放对象内存之后,可能会产生很多的内存碎片,在做新的内存分配的时候NSZone会试图去填补这些碎片,即从碎片中找到合适的内存区块以存放新的对象,这个查找的过程是需要时间开销的。所以如果需要在短时间内分配大量对象,则可以创建自己的NSZone,那么在分配对象内存的时候,只需要要当前zone的末尾分配即可,相比于去已经臃肿的default zone去分配这批对象,其耗时是更少的
。