所以我开始用Objective-c做一些关于Xcode的教程,我注意到了一件事。
如果我正在创建对象,我必须分配并初始化它,对吧? 类似的东西:
NSObject *objet = [[NSObject alloc] init];
或使用指定的初始化程序:
MyObject *object = [[MyObject alloc] initWithAttribute:attribute];
经过几次教程后,我学会了一些名为"方便的初始化器"这基本上是相同的"只是"没有关键字分配,对吗?
NSArray *array = [NSArray arrayWithObjects: @"string", nil];
我的问题是:为什么指定的初始化器总是实例方法( - )和方便初始化器总是类方法(+)?
谢谢
答案 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"]
。