美文网首页
系统宏 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