美文网首页
系统宏 NS_UNAVAILABLE & NS_DESI

系统宏 NS_UNAVAILABLE & NS_DESI

作者: 同心圆圈 | 来源:发表于2017-07-19 13:24 被阅读12次

首先说一下 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。

相关文章

网友评论

      本文标题:系统宏 NS_UNAVAILABLE & NS_DESI

      本文链接:https://www.haomeiwen.com/subject/zrdlkxtx.html