iOS 中的初始化方法链条

iOS 初始化方法链条

设计原则:
1.根据根本特性设计指定初始化方法
2.所有初始化方法根据指定初始化方法初始化

代码规范:子类化(自己写一个类),初始化方法规则
1. 重写子类,须指定初始化方法(根据根本特性)
2.重写父类初始化方法,保证指定初始化方法发挥作用

  1. init方法初始化的目的?
    对该类的根本特性设置初始化值(指定初始化方法)
    对该类的重要属性设置初始化值(其他初始化方法)

设计原则:指定初始化方法根据对应类的根本特性进行设计

例子:
a: 对于UIView,本质就是矩形区域。 因此frame属于根本特性
即设计

  • (id) initWithFrame:(CGRect)frame;

b: 设计一个矩形类 EOCRectangle。 那么其宽高就是属于根本特性。 (width,height)
即设计

  • (id) initWithWidth:(CGFloat)width height:(CGFloat)height;
  1. designed initialize (指定初始化方法、全能初始化方法) ?(同一意思)
    设计原则:所有其他的初始化方法通过该方法进行实例初始化

好处:
a:若类的根本特性更改,或类的数据结构修改,只须修改指定初始化方法。不须另外更改其他的初始化方法
b:简化代码,强于无规则的初始化

  1. 指定初始化链规则
    子类会继承父类的所有默认实现。对于非指定初始化方法,其也会调用父类的制定初始化方法。
    为使得所有的初始化方法均调用指定初始化方法,要重写父类的指定初始化方法,在其中调用子类的初始化方法。

例子 :
基本关系
NSObject

  • (id) init;

EOCRectangle : NSObject

  • (id) init; // implementation 调用了 initWithWidth:height;
  • (id) initWithWidth:(CGFloat)width height:(CGFloat)height; // designed initialize

EOCSquare : NSObject

  • (id) init; // implementation 调用了 initWithWidth:height;
  • (id) initWithWidth:(CGFloat)width height:(CGFloat)height; //
  • (id) initWithDimension:(CGFloat)dimension; // designed initialize

对于EOCSquare调用 init 方法,其在实现中会调用initWithWidth:height;(父类中实现代码如此,子类继承该规则)若子类中不在initWithWidth:height的实现中调用指定初始化方法,则不符合规则

子类化,初始化规则

  1. 重写子类,须指定初始化方法(根据根本特性)
    2.重写父类初始化方法,保证指定初始化方法发挥作用

参考资料 :《Effective Objective-C》十六条

你可能感兴趣的:(iOS 中的初始化方法链条)