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];
在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];