[className new][[className alloc]init]


  1. 在实际开发中可能很少用到 new ,一般创建对象咱们看到的都是[[className alloc]init],但是并不是意味着就不会接触到 new ,在一些代码中还是会看到使用 new ,还有面试的时候,也有可能会被问到.
  2. 那么,它们之间到底有什么不同呢?
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
+ 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 new]基本等同于[[className alloc] init];区别只在于 alloc 分配内存的时候使用了 zone 。这个 zone 是什么东东呢?它是给对象分配内存的时候。把关联的对象分配到一个相邻的内存区域内,以便于使用时消耗很少的代价,提升程序处理速度; 3. 为什么不推荐使用 new 呢? 如果,使用 new 初始化方法被固定为 init,而你又想使用 initWithXXX 怎么办?没办法!

未完待续。。。