iOS的初始化

自定义类定义接口时应该定义一个全能初始化方法,所用到的传入参数用只读属性,默认的init初始化可以通过调用全能初始化设置默认参数或抛出异常处理。
父类:

#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

这里要注意子类的复写,子类通过复写父类的全能初始化方法,可以覆盖到默认的init方法。想想子类实例的调用过程:init ->父类init->子类的initWithWidth:height:方法->initWithDimension:方法。
所以,子类复写时一定要复写父类的全能初始化方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 没有太阳的日子,已经来了很久,它来了就不想走了!人们让冷包围着,抱怨没有用,所以想着法子温暖着自己!马斯洛对人的需...
    一声笑阅读 1,774评论 0 0
  • ㈠、 20岁,大一。 吹着微风,享受着12年苦读换来的自由。挣脱了父母的怀抱,像一匹野马,奔跑在广阔的草原上,是啊...
    浅柳荨阅读 1,456评论 1 2
  • 最近让我印象深刻的一本书是《游戏改变世界》。当时沉迷游戏,荒于工作学习,日夜不可自拔。自嘲年少时同学每日放学约于网...
    Desdemona_7196阅读 4,342评论 7 5