在学习Objective-C和阅读示例代码时,我注意到对象通常是用这种方法创建的:
SomeObject *myObject = [[SomeObject alloc] init];
而不是:
SomeObject *myObject = [SomeObject new];
这是有原因的吗,因为我读到它们是等价的?
在学习Objective-C和阅读示例代码时,我注意到对象通常是用这种方法创建的:
SomeObject *myObject = [[SomeObject alloc] init];
而不是:
SomeObject *myObject = [SomeObject new];
这是有原因的吗,因为我读到它们是等价的?
当前回答
通常情况下,你需要传递参数给init,所以你将使用不同的方法,如[[SomeObject alloc] initWithString: @"Foo"]。如果你习惯了这样写,你就会养成这样做的习惯,所以[[SomeObject alloc] init]可能会比[SomeObject new]来得更自然。
其他回答
通常情况下,你需要传递参数给init,所以你将使用不同的方法,如[[SomeObject alloc] initWithString: @"Foo"]。如果你习惯了这样写,你就会养成这样做的习惯,所以[[SomeObject alloc] init]可能会比[SomeObject new]来得更自然。
一个简短的回答是:
两者都是一样的。但 'new'只适用于基本的'init'初始化式,而不是 使用其他初始化式(例如initWithString:)。
作为旁注,我个人使用[Foo new]如果我想在init中做一些事情,而不使用它的返回值。如果你没有在任何地方使用[[Foo alloc] init]的返回值,那么你会得到一个警告。或多或少,我用[Foo new]来做花瓶。
这里有一堆原因:http://macresearch.org/difference-between-alloc-init-and-new
精选的有:
new不支持自定义初始化器(比如initWithString) Alloc-init比new更显式
一般的观点似乎是你应该使用任何你觉得舒服的东西。
很老的问题,但我写了一些例子只是为了好玩-也许你会发现它有用;)
#import "InitAllocNewTest.h"
@implementation InitAllocNewTest
+(id)alloc{
NSLog(@"Allocating...");
return [super alloc];
}
-(id)init{
NSLog(@"Initializing...");
return [super init];
}
@end
在main函数中这两个语句:
[[InitAllocNewTest alloc] init];
and
[InitAllocNewTest new];
得到相同的输出:
2013-03-06 16:45:44.125 XMLTest[18370:207]分配。 [18370:207]初始化。