开发中天天都需要创建对象,可是初始化的时候为什么需要alloc init呢?alloc,init 对应又做了什么呢?
alloc:分配了一个内存给对象,让它不释放,并且把地址返回给指针。
init:初始化。
alloc分配了一坨 内存给对象之后并不能使用,因为还没有正确的初始化。
接下来查看方法源码
// malloc_default_zone 创建了一个默认大小的内存空间,然后返回_zoneAlloc
+ (id)alloc
{
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}
// 初始化
- (id)init
{
return self;
}
为什么不用new方法创建对象呢?
给对象分配一个实例,并且给它发送一个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的方式可以用其他定制的初始化方法。