iOS- alloc init new

作者: linbj | 来源:发表于2018-01-18 10:26 被阅读65次
开发中天天都需要创建对象,可是初始化的时候为什么需要alloc init呢?alloc,init 对应又做了什么呢?

alloc:分配了一个内存给对象,让它不释放,并且把地址返回给指针。
init:初始化。

alloc分配了一坨 内存给对象之后并不能使用,因为还没有正确的初始化。

image.png

接下来查看方法源码

// malloc_default_zone 创建了一个默认大小的内存空间,然后返回_zoneAlloc
+ (id)alloc
{
    return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); 
}

// 初始化
- (id)init
{
    return self;
}
为什么不用new方法创建对象呢?
image.png

给对象分配一个实例,并且给它发送一个init,然后返回一个初始化好了的对象。

+ (id)new
{
    id newObject = (*_alloc)((Class)self, 0);
    Class metaClass = self->ISA();
    if (class_getVersion(metaClass) > 1)
        return [newObject init];
    else
        return newObject;
}

new方法结合了alloc init方法,alloc初始化对象之后将isa指针指向类的数据结构,然后用init初始化。

new方法和alloc init 方法的区别( IOS基础——alloc、init和new方法区别
):

  • 是否显示调用init方法
  • alloc分配内存的时候使用了zone它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的内存,提升了程序处理速度。
  • 采用new方法只能采用默认的init方法完成初始化,采用alloc的方式可以用其他定制的初始化方法。

相关文章

网友评论

    本文标题:iOS- alloc init new

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