使用alloc init而不是new

学习Objective-C和阅读示例代码,我注意到对象通常是使用这种方法创build的:

SomeObject *myObject = [[SomeObject alloc] init]; 

代替:

 SomeObject *myObject = [SomeObject new]; 

有没有这个原因,我已经读过,他们是相同的?

这里有一些原因: http : //macresearch.org/difference-between-alloc-init-and-new

一些选定的是:

  • new不支持自定义初始值设定项(如initWithString)
  • alloc-initnew更明确

一般意见似乎是你应该使用任何你感到舒服的。

非常古老的问题,但我写了一些例子只是为了好玩 – 也许你会觉得它有用;)

 #import "InitAllocNewTest.h" @implementation InitAllocNewTest +(id)alloc{ NSLog(@"Allocating..."); return [super alloc]; } -(id)init{ NSLog(@"Initializing..."); return [super init]; } @end 

在main函数中这两个语句:

 [[InitAllocNewTest alloc] init]; 

 [InitAllocNewTest new]; 

导致相同的输出:

 2013-03-06 16:45:44.125 XMLTest[18370:207] Allocating... 2013-03-06 16:45:44.128 XMLTest[18370:207] Initializing... 

在Apple的NSObject实现中+alloc/-init等同于+alloc/-init 。 这种情况不太可能会改变,但是根据你的偏执狂水平,苹果的+new的文档似乎允许将来改变实现(并打破等同)。 出于这个原因,因为“显式优于隐式”和历史连续性,Objective-C社区通常避免+new 。 然而,你可以通过坚持使用+new来将最近的Java入门者发现到Objective-C。

通常情况下,你需要将parameter passing给init ,所以你将使用不同的方法,比如[[SomeObject alloc] initWithString: @"Foo"] 。 如果你习惯于写这个,你就习惯这样做,所以[[SomeObject alloc] init]可能会更自然地[SomeObject new]

一个简短的回答是:

  1. 两者都是一样的。 但
  2. 'new'只能在基本的'init'初始化器中使用,并且不能和其他初始化器一起工作(例如initWithString :)。

对于一个侧面说明,我个人使用[Foo new]如果我想在init中执行某些操作而不使用任何地方的返回值。 如果你不使用任何地方的[[Foo alloc] init]的返回值,那么你会得到一个警告。 或多或less,我用[Foo new]为眼睛糖果。

如果新的为你做的工作,那么它会使你的代码适度小一些。 如果您要在代码中的许多不同的地方调用[[SomeClass alloc] init] ,您将在new的实现中创build一个Hot Spot(即在objc运行时),这将减lesscaching未命中的次数。

在我的理解,如果你需要使用自定义初始化使用[[SomeClass alloc] initCustom]

如果你不这样做,请使用[SomeClass new]

我对此很迟,但是我想提一下,在Swift世界里的Obj-C实际上并不安全。 如果你不创build任何其他的初始化器,Swift将只创build一个默认的init方法。 使用自定义初始值设定项调用swift类会导致崩溃。 如果你使用alloc / init,那么编译器会正确地抱怨init不存在。