objective-c中的便捷初始化程序

时间:2014-07-17 15:10:50

标签: objective-c class initialization

所以我开始用Objective-c做一些关于Xcode的教程,我注意到了一件事。

如果我正在创建对象,我必须分配并初始化它,对吧? 类似的东西:

NSObject *objet = [[NSObject alloc] init];

或使用指定的初始化程序:

MyObject *object = [[MyObject alloc] initWithAttribute:attribute];

经过几次教程后,我学会了一些名为"方便的初始化器"这基本上是相同的"只是"没有关键字分配,对吗?

NSArray *array = [NSArray arrayWithObjects: @"string", nil];

我的问题是:为什么指定的初始化器总是实例方法( - )和方便初始化器总是类方法(+)?

谢谢

3 个答案:

答案 0 :(得分:3)

指定的初始化程序是所有其他init方法调用的程序。为了正确定义执行自己初始化的子类,您需要覆盖其超类的指定初始值设定项。

您在此处确定的另一种方法不称为便利初始化程序 - 它是一个方便的构造函数。该名称指的是便利构造函数为您创建和初始化对象的事实。与使用alloc创建的对象不同,您不拥有从便捷构造函数返回的对象,因此在手动保留/释放模式下不需要释放。 (通常它是自动释放的,但这是一个实现细节。)

答案 1 :(得分:2)

类方法(+)不被视为任何类型的初始化器。它们通常被称为工厂方法。在简单的情况下,这些方法的实现调用alloc和一些init来创建对象的实例,然后返回该对象。我认为它们变得普遍的原因之一与在ARC之前的日子里容易提供自动释放的物体有关,尽管其他人可能比我更好地解决这个问题。

objective-C中的初始化程序始终是实例方法( - ),并且只是遵循以init开头的约定的方法。便利初始化器与designated initializer形成对比。指定的初始化程序是一个初始化方法,您选择它作为主要负责初始化对象状态的主要方法,其他初始化程序可以调用指定的初始化程序而不是超类初始化程序。

所有初始化程序都旨在与alloc一起使用; alloc分配并初始化对象所需的内存,初始化程序设置对象的字段,属性等的开始状态,可能基于调用者发送的参数提供的值。

答案 2 :(得分:1)

便利工厂方法,例如

NSArray *array = [NSArray arrayWithObjects: @"string", nil];
作为实现的一部分,

将为您调用alloc和常规构造函数。他们没有任何特殊的解决方法来避免调用alloc(通常;在某些特殊情况下,他们可能会返回单例,例如NSNumber)。您仍在进行分配和初始化步骤。

他们只是更方便&紧凑阅读&写。

FWIW,上面的数组创建更方便现在可以写:@[@"string"]