使用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-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];
和
[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]
。
一个简短的回答是:
- 两者都是一样的。 但
- '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不存在。