在OC中创建对象一般使用 [[className alloc] init] , 但是也有一个方法 [className new] , 先了解两者的区别
- new 的源码
+ 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;
}
通过上面的源码可以看到 [[className alloc] init] 和 [className new] 差不多,只不过alloc分配内存的时候使用了zone(zone是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度)
因此建议用 [[className alloc] init] 会比较快,性能也比较好;并且使用 [className new]只能调用init方法,不能调用其它初始化方法
网友评论