Objective C 初始化方法:alloc/init 对比其他初始化方法

Objective C initialization methods: alloc/init vs. other initializers

在Objective C中,大多数对象都是使用[[ObjectType alloc] init]创建的。我还见过使用 [[ObjectType alloc] initWithOption1:...] (带参数)的初始化器。但是有些类建议不使用alloc方法初始化,比如新的iOS8UIAlertController,使用[UIAlertController alertControllerWithTitle:message:preferredStyle:]方法初始化,或 UIButton,它使用 buttonWithType: 方法。 这样做的 advantages/disadvantages 是什么?如何制作这样的初始化程序?

它被称为便利初始化器。这些 class 方法将初始化和配置的对象返回给您。在他们的实施中,他们自己做了 alloc/init 部分。 Google往上看,你会发现很多例子。

假设您正在使用 ARC(而且我找不到不在任何新项目中使用 ARC 的借口),这两种方法之间基本上没有区别。

要创建这些工厂方法之一,就这么简单...

给定初始化方法:

- (instancetype)initWithArgument1:(id)arg1 argument2:(id)arg2;

我们创建以下 class 方法:

+ (instancetype)myClassWithArgument1:(id)arg1 argument2:(id)arg2 {
    return [[self alloc] initWithArgument1:arg1 argument2:arg2];
}

就这么简单。

现在代替:

MyClass *obj = [[MyClass alloc] initWithArgument1:foo argument2:bar];

我们可以简单的写成:

MyClass *obj = [MyClass myClassWithArgument1:foo argument2:bar];