美文网首页
iOS new&alloc/init区别

iOS new&alloc/init区别

作者: LYPC_下里巴人 | 来源:发表于2017-12-11 09:35 被阅读94次

    下班路上突然脑子里冒出来这个问题,自问了一下,很尴尬我也不知道不知道区别在哪里,那么就分析分析吧,也是对自己加深一下印象:

    • new
      目前我见过的项目里面偶尔会出现这样写的,我个人搬砖的时候 几乎不用它new对象,至于这个new到底干啥了:
      从网上找了些前辈们的资料和源码分析,现在看下:
    创建一个oc对象:
    NSObject *obj_1 = [[NSObject alloc]init];  
    NSObject *obj_2 = [NSObject new]; 
    
    new的实现:
    + (id)new  
    {  
        id newObject = (*_alloc)((Class)self, 0);  
        Class metaClass = self->isa;  
        if (class_getVersion(metaClass) > 1)  
            return [newObject init];  
        else  
            return newObject;   
    }  
    
    alloc/init的实现:
    + (id)alloc  
    {  
        return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());  
    }  
    - (id)init  
    {  
        return self;  
    } 
    

    区别上从_alloc和_zoneAlloc中可以看出,new使用了zone,它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度。
    但如果使用new的话,初始化方法被固定死只能调用init.不能再使用init开头的其它初始化方法,据说最初的设计是完全借鉴Smalltalk语法来的,传说那个时候已经有allocFromZone:这个方法,只是给对象分配了内存,并没有初始化实例变量,但是这个方法需要传个参数id myCompanion = [[TheClass allocFromZone:[self zone]] init];

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

    总的来说,两种方式创建对象现在基本上一样,区别就是使用new只能默认init进行初始化,alloc方式可以使用其它的init开头的方法进行初始化。

    相关文章

      网友评论

          本文标题:iOS new&alloc/init区别

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