美文网首页ios面试常见问题
alloc init 和new 以及[NSArray arra

alloc init 和new 以及[NSArray arra

作者: Amor瑾年v | 来源:发表于2021-03-08 14:49 被阅读0次

    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

    相关文章

      网友评论

        本文标题:alloc init 和new 以及[NSArray arra

        本文链接:https://www.haomeiwen.com/subject/krdpqltx.html