alloc init 和 new

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去分配这批对象,其耗时是更少的


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容