ios面试常见问题

alloc init 和new 以及[NSArray arra

2021-03-08  本文已影响0人  Amor瑾年v

1.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; 
}

[className new]基本等同于[[className alloc] init],区别只在于alloc分配内存的时候使用了zone,它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度;

而为什么不推荐使用new?

如果使用new的话,初始化方法被固定死只能调用init,采用alloc的方式可以用其他定制的初始化方法。

[NSArray new]和[[NSArray alloc] init]返回一个保留计数为1的数组.在ARC之前,您必须释放或自动释放该阵列,否则您将泄漏内存.

[NSArray数组]和@ []返回一个已经自动释放的数组(保留计数0).如果你想让它在没有ARC的情况下坚持下去,你必须手动保留它,否则当弹出当前自动释放池时它将被释放.

截屏2021-03-08 下午2.53.35.png
上一篇下一篇

猜你喜欢

热点阅读