美文网首页
new和alloc的区别

new和alloc的区别

作者: Jey | 来源:发表于2018-11-30 18:13 被阅读14次

    在面试中经常遇到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开头的定制方法进行初始化。

    相关文章

      网友评论

          本文标题:new和alloc的区别

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