第16条:提供“全能初始化方法”

所有对象均要初始化。

 

可为对象提供必要信息以便其能完成工作的初始化方法叫做“全能初始化方法”(designated initializer, 也常译为:“指定初始化方法”)。

 

初始化方法可以调用全能初始化方法来实现(一个类可以有多个)。于是,只有在全能初始化方法中,才会存储内部数据。这样的话,当底层数据存储机制改变时,只需要修改此方法就好,无须改动其他初始人方法。

 

根据后面第18条中的建议,我们把属性声明为只读。这样一来外部就直接无法设置对象的属性了。这就需要提供初始化方法。

例:
-(id)initWithWidth:(float)width {
  if (self = [super init]) {
    _width = width;
    _height = height;
  }
  return self;
}

// 使用默认值

-(id)init {

  return [self initWithWidth: 5.0f andHeight:10.0f];
}

// 抛出异常

-(id)init {

  @throw [NSException exceptionWithName:NSInternalInconsistencyException reason: @"Must use initWithWidth:andHeight: instead." userInfo:nil];
}

// Mac OS X的AppKit与iOS的UIKit这两个UI框架都广泛运用此机制,将对象序列化,并保存至XML格式的“NIB”文件中。

这些NIB文件通常用来存放视图控制器(view controller)及视图布局。
加载NIB文件时,系统在解压缩(unarchiving)的过程中解码视图控制器。
NSCoding协议定义了下面这个初始化方法。

-(id)initWithCoder:(NSCoder*)decoder;

 

总结:

1、全能初始化方法的调用链一定要维系。

2、如果子类的全能初始化方法与超类方法的名称不同(或者说:超类的初始化方法不适用于子类),那么总应覆写超类的全能初始化方法(方式有:a/使用默认值;b/抛出异常)。

3、每个子类的全能初始化方法都应该调用其超类的对应方法,并逐层向上。

4、在类中提供一个全能初始化方法,并于文档里指明。其他初始化方法均应调用此方法。

转载于:https://www.cnblogs.com/Pikdays/p/4373040.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值