指定初始化和便利初始化

NS_DESIGNATED_INITIALIZER 来声明指定初始化方法

1,指定初始化方法必须调用父类的指定初始化方法(通过super的方式),NSObject是所有类的根类,其指定初始化方法是init。
2,类的便利初始化方法必须调用类的其他指定初始化方法。
3,类实现了指定初始化方法,必须实现(重写)父类的所有指定初始化方法

.h文件
@interface FGPeople : NSObject

- (instancetype)init UNAVAILABLE_ATTRIBUTE;
- (instancetype)initWithName:(NSString *)name NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithAddress:(NSString *)address;

+ (instancetype)peopleWithName:(NSString *)name;

@end

.m文件
@interface FGPeople()

@property(nonatomic, copy) NSString *name;

@end

@implementation FGPeople

// 1,指定初始化方法调用父类的指定初始化方法
- (instancetype)initWithName:(NSString *)name {
    self = [super init];
    self.name = name;
    return self;
}

// 2 便利初始化方法调用本类的其他指定初始化方法
- (instancetype)initWithAddress:(NSString *)address {
    return [self initWithName:address];
}
// 重写父类的指定初始化方法,因为.h中init后有UNAVAILABLE_ATTRIBUTE标记,所以即使不重写也不会警告,但如果没有标记,不重写就会警告
- (instancetype)init {
    self = [self initWithName:@"unknow"];
    return self;
}

+ (instancetype)peopleWithName:(NSString *)name {
    FGPeople *people = [[FGPeople alloc] initWithName:name];
    return people;
}

@end

子类

.h文件
@interface FGStudent : FGPeople

- (instancetype)initWithGrade:(NSString *)grade NS_DESIGNATED_INITIALIZER;

@end

.m文件
@interface FGStudent()

@property(nonatomic, copy) NSString *grade;

@end

@implementation FGStudent
// 3 重写父类的指定初始化方法
-(instancetype)initWithName:(NSString *)name {
    return [self initWithGrade:name];
}

-(instancetype)initWithGrade:(NSString *)grade {
    self = [super initWithName:@"unknow"];
    self.grade = grade;
    return self;
}

@end

调用流程图

Swift

Swift中有些特殊
1,如果子类中没有任何指定初始化方法,则会继承所有来自父类的指定初始化方法,否则不继承。
2,如果子类提供了所有父类指定构造器的实现,不管是通过 规则 1 继承过来的, 还是通过自定义实现的, 它将自动继承所有父类的便利构造器。
4,如果子类实现了父类的所有指定初始化方法,不管是继承还是自定义的,则子类会继承父类的所有便利初始化方法。

1,Swift的指定初始化方法,必须在本类的属性已经确定后,才调用父类的指定初始化方法,
2,Swift继承自父类的属性不能在调用父类的指定初始化方法之前赋值(会被覆盖)。
3,便利初始化方法中,属性的赋值只能在调用指定初始化方法后进行。
4,对属性的读,实例方法的调用必须在初始化方法调用后才能进行。

链接
https://docs.swift.org/swift-book/LanguageGuide/Initialization.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值