所以我开始用objective-c做一些Xcode教程,我注意到一件事。
如果我要创建对象,我必须分配并初始化它,对吧?比如:
NSObject *objet = [[NSObject alloc] init];
或指定初始化式:
MyObject *object = [[MyObject alloc] initWithAttribute:attribute];
在几次教程之后,我学到了一些叫做"方便初始化器"的东西,基本上和没有关键字alloc的"只是"一样,对吧?
NSArray *array = [NSArray arrayWithObjects: @"string", nil];
我的问题是:为什么指定初始化器总是实例方法(-)和方便初始化器总是类方法(+)?
谢谢
指定初始化器是所有其他初始化方法都要调用的初始化器。为了正确定义一个自己进行初始化的子类,你需要重写它的父类的指定初始化器。
您在这里确定的另一种方法不称为便利初始化器-它是便利构造函数。这个名称指的是一个便利构造函数既为您创建对象又为您初始化对象的事实。与使用alloc
自己创建的对象不同,您不拥有从方便构造函数返回的对象,因此在手动保留/释放模式下不需要释放。(通常它是自动发布的,但这是一个实现细节)
类方法(+)不被视为任何类型的初始化器。它们通常被称为工厂方法。在简单的情况下,这些方法的实现调用alloc
和init
的一些风格来创建对象的实例,然后返回该对象。我认为它们变得普遍的原因之一是在arc之前的日子里很容易提供自动发布对象,尽管其他人可能比我更能解决这方面的问题。
objective-C中的初始化器总是实例方法(-),并且只是遵循从init
开始的惯例的方法。便利初始化器与指定初始化器相反。指定初始化器是你选择的一个主要的初始化方法,它主要负责对象状态的初始化,其他初始化器可以调用指定初始化器,而不是超类初始化器。
所有的初始化式都被设计成与alloc
结合使用;alloc
分配和初始化对象所需的内存,并且初始化器可能基于调用者发送的参数中提供的值来设置对象的字段,属性等的起始状态。
便利工厂方法,例如
NSArray *array = [NSArray arrayWithObjects: @"string", nil];
将作为其实现的一部分,为您调用alloc
和常规构造函数。它们并不是避免调用alloc(通常;在某些特殊情况下,它们可能返回一个单例(例如NSNumber)。您仍然在执行分配和初始化步骤。
它们只是更方便&紧凑阅读&写。
哎呀,上面的数组创建是更方便了现在写:@[@"string"]
.