zoukankan      html  css  js  c++  java
  • 第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、在类中提供一个全能初始化方法,并于文档里指明。其他初始化方法均应调用此方法。

  • 相关阅读:
    C#利用HttpWebRequest进行post请求的示例(HTTPS)
    以文件流的方式读取本地文件
    C#读取xml文件指定节点下的值
    C# get post 的方法
    SQL2008安装后激活方式以及提示评估期已过解决方法(转)
    python 左移右移 2个数交换
    python 循环内部添加多个条件判断会出现越界
    python __new__ __init__ __del__
    python 模块中__all__作用
    Python urllib的urlretrieve()函数解析 (显示下载进度)
  • 原文地址:https://www.cnblogs.com/Pikdays/p/4373040.html
Copyright © 2011-2022 走看看