美文网首页
NS_ASSUME_NONNULL_BEGIN和NS_ASSUM

NS_ASSUME_NONNULL_BEGIN和NS_ASSUM

作者: 烟雨任平生YL | 来源:发表于2018-03-01 21:55 被阅读16次

    Nonnull区域设置(Audited Regions)

    如果需要每个属性或每个方法都去指定nonnull和nullable,是一件非常繁琐的事。苹果为了减轻我们的工作量,专门提供了两个宏:NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END。

    #define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
    #define NS_ASSUME_NONNULL_END   _Pragma("clang assume_nonnull end")   
    
    NS_ASSUME_NONNULL_BEGIN
    @interface TestNullabilityClass () 
    @property (nonatomic, copy) NSArray * items; 
    - (id)itemWithName:(nullable NSString *)name; 
    @end 
    NS_ASSUME_NONNULL_END}
    

    在上面的代码中,items属性默认是nonnull的,itemWithName:方法的返回值也是nonnull,而参数是指定为nullable的。
    不过,为了安全起见,苹果还制定了几条规则:

    • typedef定义的类型的nullability特性通常依赖于上下文,即使是在Audited Regions中,也不能假定它为nonnull。
    • 复杂的指针类型(如id *)必须显示去指定是nonnull还是nullable。例如,指定一个指向nullable对象的nonnull指针,可以使用”__nullable id * __nonnull”。
    • 我们经常使用的NSError **通常是被假定为一个指向nullable NSError对象的nullable指针。

    相关文章

      网友评论

          本文标题:NS_ASSUME_NONNULL_BEGIN和NS_ASSUM

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