iOS 初始化方法链条
设计原则:
1.根据根本特性设计指定初始化方法
2.所有初始化方法根据指定初始化方法初始化
代码规范:子类化(自己写一个类),初始化方法规则
1. 重写子类,须指定初始化方法(根据根本特性)
2.重写父类初始化方法,保证指定初始化方法发挥作用
- init方法初始化的目的?
对该类的根本特性设置初始化值(指定初始化方法)
对该类的重要属性设置初始化值(其他初始化方法)
设计原则:指定初始化方法根据对应类的根本特性进行设计
例子:
a: 对于UIView,本质就是矩形区域。 因此frame属于根本特性
即设计
- (id) initWithFrame:(CGRect)frame;
b: 设计一个矩形类 EOCRectangle。 那么其宽高就是属于根本特性。 (width,height)
即设计
- (id) initWithWidth:(CGFloat)width height:(CGFloat)height;
- designed initialize (指定初始化方法、全能初始化方法) ?(同一意思)
设计原则:所有其他的初始化方法通过该方法进行实例初始化
好处:
a:若类的根本特性更改,或类的数据结构修改,只须修改指定初始化方法。不须另外更改其他的初始化方法
b:简化代码,强于无规则的初始化
- 指定初始化链规则
子类会继承父类的所有默认实现。对于非指定初始化方法,其也会调用父类的制定初始化方法。
为使得所有的初始化方法均调用指定初始化方法,要重写父类的指定初始化方法,在其中调用子类的初始化方法。
例子 :
基本关系
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的实现中调用指定初始化方法,则不符合规则
子类化,初始化规则
- 重写子类,须指定初始化方法(根据根本特性)
2.重写父类初始化方法,保证指定初始化方法发挥作用
参考资料 :《Effective Objective-C》十六条
网友评论