源代码:
+ new
{
id newObject = (*_alloc)((Class)self, 0);
Class metaClass = self->isa;
if (class_getVersion(metaClass) > 1)
return [newObject init];
else
return newObject;
}
+ alloc
{
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}
- init
{
return self;
}
[className new]
基本等同于[[className alloc] init]
. 区别只在于alloc
分配内存的时候使用了zone
,这个zone
它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度.
为什么要把alloc
和init
分开?
- 可以使用多种
init
方法 - 显示调用总比隐式调用要好
如果确实不需要用其他的init函数,比如initWithString
, 只是使用[Nsobject alloc] init]
,那用new
的方法更加方便
* new doesn't support custom initializers (like initWithString)
* alloc-init is more explicit than new