自定義類定義接口時(shí)應(yīng)該定義一個(gè)全能初始化方法,所用到的傳入?yún)?shù)用只讀屬性,默認(rèn)的init初始化可以通過調(diào)用全能初始化設(shè)置默認(rèn)參數(shù)或拋出異常處理田炭。
父類:
#import "TestRectangle.h"
@interface TestRectangle : NSObject
@property (nonatomic, assign, readonly) CGFloat width;
@property (nonatomic, assign, readonly) CGFloat height;
- (instancetype)initWithWidth:(CGFloat)width height:(CGFloat)height;
@end
@implementation TestRectangle
- (instancetype)initWithWidth:(CGFloat)width height:(CGFloat)height {
if (self = [super init]) {
_width = width;
_height = height;
}
return self;
}
//- (instancetype)init {
// @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Must use xxx instead" userInfo:nil];
//}
- (instancetype)init {
return [self initWithWidth:5.0 height:10.0];
}
@end
子類:
#import "TestSquare.h"
@interface TestSquare : TestRectangle
- (instancetype)initWithDimension:(CGFloat)dimension;
@end
@implementation TestSquare
- (instancetype)initWithDimension:(CGFloat)dimension {
return [super initWithWidth:dimension height:dimension];
}
- (instancetype)initWithWidth:(CGFloat)width height:(CGFloat)height {
CGFloat dimension = MAX(width, height);
return [self initWithDimension:dimension];
}
@end
這里要注意子類的復(fù)寫,子類通過復(fù)寫父類的全能初始化方法,可以覆蓋到默認(rèn)的init方法鼻忠。想想子類實(shí)例的調(diào)用過程:init ->父類init->子類的initWithWidth:height:方法->initWithDimension:方法。
所以杈绸,子類復(fù)寫時(shí)一定要復(fù)寫父類的全能初始化方法帖蔓。