【问题标题】:Objective C initialization methods: alloc/init vs. other initializersObjective C 初始化方法:alloc/init 与其他初始化方法
【发布时间】:2015-05-17 21:30:23
【问题描述】:

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

【问题讨论】:

  • 没有alloc,你不应该需要release(在ARC之前),有时最好在init中设置对象的一些参数而不是在之后设置它们。这取决于。

标签: objective-c methods initialization initializer


【解决方案1】:

假设您使用的是 ARC(我找不到任何理由不将 ARC 用于任何新项目),这两种方法基本上没有区别。

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

给定初始化方法:

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

我们创建以下类方法:

+ (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];

【讨论】:

    【解决方案2】:

    它被称为便利初始化器。这些类方法将初始化和配置的对象交还给您。在他们的实现中,他们自己做 alloc/init 部分。谷歌一下,你会发现很多例子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多