首先说一下 Designated Initializer(指定初始化器)
-
每个类的正确初始化过程应当是按照从子类到父类的顺序,依次调用每个类的Designated Initializer。并且用父类的Designated Initializer初始化一个子类对象,也需要遵从这个过程。
-
如果子类指定了新的初始化器,那么在这个初始化器内部必须调用父类的Designated Initializer。并且需要重写父类的Designated Initializer,将其指向子类新的初始化器。
指定初始化函数 NS_DESIGNATED_INITIALIZER 使用场景
.h
@property (nonatomic, strong) NSDictionary *data;
- (instancetype)initWithDictionary:(NSDictionary *)data NS_DESIGNATED_INITIALIZER;
.m
- (instancetype)init {
return [self initWithDictionary:nil];
}
- (instancetype)initWithDictionary:(NSDictionary *)data {
self = [super init];
if (self) {
if (data && [data isKindOfClass:[NSDictionary class]]) {
[self setValuesForKeysWithDictionary:data];
}
if (![self.data isKindOfClass:[NSDictionary class]] && ![self.data isKindOfClass:[NSArray class]]) {
self.data = @{};
}
}
return self;
}
说明:当在.m中不实现init的方法的时候 xcode会报️(警告),需要实现此方法
NS_UNAVAILABLE 用来修饰的方法,表示这个类的这个方法是不可用的。
代表这个类的init方法不可用(失效)
编译器不但不会提示补全 init 方法,就算开发人员强制发送 init 消息,编译器会直接报错。
- (instancetype)init NS_UNAVAILABLE
{
return nil;
}
NS_ASSUME_NONNULL_BEGIN、NS_ASSUME_NONNULL_END,如果需要每个属性或每个方法都去指定 nonnull 和 nullable,是一件非常繁琐的事。苹果为了减轻我们的工作量,专门提供了这两个宏。在这两个宏之间的代码,所有比较简单指针对象都被假定为 nonnull,因此我们只需要去指定那些 nullable 的指针。如果我们强行通过点语法将一个非空指针置空,编译器会报 warning。
网友评论