您好,欢迎来到二三娱乐。
搜索
您的当前位置:首页new和alloc的区别

new和alloc的区别

来源:二三娱乐

在面试中经常遇到new和alloc创建到底有什么区别?
下面我们从内部实现看下:

+ new 
{ 
id newObject = (*_alloc)((Class)self, 0); 
Class metaClass = self->isa; 
if (class_getVersion(metaClass) > 1) 
return [newObject init]; 
else 
return newObject; 
} 
 
//而 alloc/init 像这样: 
+ alloc 
{ 
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());  
} 
- init 
{ 
return self; 
} 

区别只在于alloc分配内存的时候使用了zone.
这个zone是个什么东东呢?
它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度。

用new的话,初始化方法被固定死只能调用init.不能再使用init开头的其它初始化方法,据说最初的设计是完全借鉴Smalltalk语法来的,传说那个时候已经有allocFromZone:这个方法,只是给对象分配了内存,并没有初始化实例变量,但是这个方法需要传个参数id myCompanion = [[TheClass allocFromZone:[self zone]] init];
这个方法像下面这样:

+ allocFromZone:(void *) z
{
    return (*_zoneAlloc)((Class)self, 0, z);
}
 
//后来简化为下面这个:
+ alloc
{
    return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}

这个方法只是给对象分配了内存,并没有初始化实例变量。

两种方式创建方式在功能上几乎是一致的,分配内存并完成初始化,区别就是使用new只能默认init进行初始化,alloc方式可以使用其它的init开头的定制方法进行初始化。

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

热门图文

Copyright © 2019-2025 yule263.com 版权所有 湘ICP备2023023988号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务