在Objective-C中的alloc,init和new

一本关于iPhone编程的书籍就是这样的例子:

[[Class alloc] init] 

另一本关于Objective-C的书是这样的:

 [Class new] 

有什么不同?

最初在Objective-C中,对象是使用new创build的。 随着OpenStep / Cocoa框架的发展,devise人员开发了这样的观点,即为对象分配内存并初始化对象的属性是不同的问题,因此应该是单独的方法(例如,对象可以分配在特定的内存区域中)。 所以对象创build的alloc-init风格受到了青睐。

基本上,new是旧的,几乎不被大量使用 – 因此你会看到Cocoa类有很多init方法,但几乎没有任何自定义的新方法。

+new实现的字面意思是:

 + (id) new { return [[self alloc] init]; } 

没有什么比这更less的了。 类可能会覆盖它,但是非常不赞成使用+fooWithBar:

如前所述,通过defaut没有区别。 但是你可以覆盖new类方法。 苹果的文档对此有一些想法。

alloc不同, new有时被重新实现在子类中以调用特定于类的初始化方法[…]通常new …方法不仅仅是分配和初始化。

它依赖于Class,但[Class new]很可能是一个在内部调用[[Class alloc] init]的便捷方法。 因此,你不能调用其他的init方法,比如“initWithString”。