在学习Objective-C和阅读示例代码时,我注意到对象通常是用这种方法创建的:
SomeObject *myObject = [[SomeObject alloc] init];
而不是:
SomeObject *myObject = [SomeObject new];
这是有原因的吗,因为我读到它们是等价的?
在学习Objective-C和阅读示例代码时,我注意到对象通常是用这种方法创建的:
SomeObject *myObject = [[SomeObject alloc] init];
而不是:
SomeObject *myObject = [SomeObject new];
这是有原因的吗,因为我读到它们是等价的?
当前回答
我很晚才提到这个,但我想说的是,这个新在oj - c和Swift的世界里实际上是不安全的。如果你没有创建任何其他初始化式,Swift只会创建一个默认的init方法。在使用自定义初始化项的swift类上调用new将导致崩溃。如果你使用alloc/init,那么编译器会正确地报错init不存在。
其他回答
作为旁注,我个人使用[Foo new]如果我想在init中做一些事情,而不使用它的返回值。如果你没有在任何地方使用[[Foo alloc] init]的返回值,那么你会得到一个警告。或多或少,我用[Foo new]来做花瓶。
我很晚才提到这个,但我想说的是,这个新在oj - c和Swift的世界里实际上是不安全的。如果你没有创建任何其他初始化式,Swift只会创建一个默认的init方法。在使用自定义初始化项的swift类上调用new将导致崩溃。如果你使用alloc/init,那么编译器会正确地报错init不存在。
+new is equivalent to +alloc/-init in Apple's NSObject implementation. It is highly unlikely that this will ever change, but depending on your paranoia level, Apple's documentation for +new appears to allow for a change of implementation (and breaking the equivalency) in the future. For this reason, because "explicit is better than implicit" and for historical continuity, the Objective-C community generally avoids +new. You can, however, usually spot the recent Java comers to Objective-C by their dogged use of +new.
通常情况下,你需要传递参数给init,所以你将使用不同的方法,如[[SomeObject alloc] initWithString: @"Foo"]。如果你习惯了这样写,你就会养成这样做的习惯,所以[[SomeObject alloc] init]可能会比[SomeObject new]来得更自然。
一个简短的回答是:
两者都是一样的。但 'new'只适用于基本的'init'初始化式,而不是 使用其他初始化式(例如initWithString:)。