Skip to content

Latest commit

 

History

History
84 lines (54 loc) · 3.58 KB

Objective-C 拾遗:designated initializer.md

File metadata and controls

84 lines (54 loc) · 3.58 KB

#Objective-C 拾遗:designated initializer

###designated initializer是什么

The initializer of a class that takes the full complement of initialization parameters is usually the designated initializer. 1

来自官方文档的介绍是designated initializer 通常是接收最多初始化参数的一个initializer

###designated initializer的作用 一个类通常会有一个提供便利初始化的initializer,它通常接收最多的初始化参数。而这个initializer便通常是designated initializer,一个类里面最重要的initializer。主要的implementation都写在这里。其他initializer则调用它即可,不需要重复写相关代码。

例如一个Task类,它有三个initializer

- (id)init;
- (id)initWithTitle:(NSString *)aTitle;
- (id)initWithTitle:(NSString *)aTitle date:(NSDate *)aDate;

则designated initializer便是

- (id)initWithTitle:(NSString *)aTitle date:(NSDate *)aDate;

其他初始化方法则是convenience initializer,通过调用designated initializer或其他initializer来完成初始化工作。

- (id)initWithTitle:(NSString *)aTitle {
    return [self initWithTitle:aTitle date:[NSDate date]];
}
 
- (id)init {
    return [self initWithTitle:@”Task”];
}

###designated initializer的使用 事实上 Swift同样也使用了designated initializer这样的概念。

而且更加严格地定义了designated initializer和它的使用规则。 详情可以查阅《The Swift Programming Language》。目前由于Swift还没有足够稳定,还没有花时间在上面。但是可以想象得到Swift有着非常好的前景。

使用的规则是基本一致的,我们在OC也是遵循这样的规则的。

Rule 1 A designated initializer must call a designated initializer from its immediate superclass.

Rule 2 A convenience initializer must call another initializer from the same class.

Rule 3 A convenience initializer must ultimately call a designated initialize2

规则可以用这样一幅图显示:

![](Designated Initializers and Convenience Initializers.png)

###个人心得

在自己的开发过程中,合理地遵守和运用designated initializer会减少许多重复代码。

并且理解了这一个概念,对整个Cocoa框架的理解也有帮助。 例如UIViewController的Designated initializer是

- (instancetype)initWithNibName:(NSString *)nibName
                         bundle:(NSBundle *)nibBundle

但是可能有人会发现,如果你直接使用 [[viewController alloc]init]来生产Controller,且你是使用XIB来组织界面的,那么最后你得到的ViewController的View还是来自XIB的。

这背后的原因就是Designated initializer帮你完成了这个工作。

If you specify nil for the nibName parameter and you do not override the loadView method, the view controller searches for a nib file using other means.3

不断学习,不断收获。深化与挖掘的结果不仅仅对开发有利,也满足了好奇心与求知欲。加油!

Footnotes

  1. Cocoa Core Competencies

  2. Designated Initializers and Convenience Initializers

  3. UIViewController Class Reference