• NS_ASSUME_NONNULL_BEGIN 延伸


    • NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END

    在.h文件中,可以看到这两个宏,翻看定义,这两个宏的代码是

    #define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
    #define NS_ASSUME_NONNULL_END   _Pragma("clang assume_nonnull end")

    知识普及:

    说到这两个宏就需要引申出Swift和Objective-C的差异。在Swift中有一个明显的区别就是optional reference,比方说NSViewNSView?.但是在OC中就都只能是NSView *类型。因为Swift编译器并不能确定NSView *是否为optional类型,所以在Swift中,会被隐式解包为NSView!.

    因此OC添加了_Nullable_Nonnull这两种类型注释。

    比方说下面的代码:

    @interface AAPLList : NSObject <NSCoding, NSCopying>
    // ...
    - (AAPLListItem * _Nullable)itemWithName:(NSString * _Nonnull)name;
    @property (copy, readonly) NSArray * _Nonnull allItems;
    // ...
    @end
    
    // --------------
    
    [self.list itemWithName:nil]; // warning!

    声明了一个非空的形参,返回值为可空的方法和一个非空的属性。

    另外,也可以这样使用(注意两种用法的区别,第一种是放在类型后面,需要添加下划线。第二种是在类型之前)

    - (nullable AAPLListItem *)itemWithName:(nonnull NSString *)name;
    - (NSInteger)indexOfItem:(nonnull AAPLListItem *)item;
    @property (copy, nullable) NSString *name;
    @property (copy, readonly, nonnull) NSArray *allItems;

    回到两个宏定义上:使用NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END可以表明所有的指针类型都为nonnull.

    NS_ASSUME_NONNULL_BEGIN
    
    @interface Student: NSObject
    @property (nonatomic, copy) NSString *name;
    - (nullable Student*)studentWithName:(NSString *)name;
    @end
    
    NS_ASSUME_NONNULL_END
    
    Student *s = [self studentWithName: nil]; // warning
    self.name = nil; // warning

    出于安全考虑,这条规则有几个例外:

    • typedef 类型一般没有内在的可空性——它们要么为空,要么非空,根据具体的取值而定。因此,即使在审核区内,typedef 类型也不会默认为nonnull
    • 复合指针类型,如id *,必须显式使用注解。例如,指明一个非空的指针指向可空的对象引用,要用__nullable id * __nonnull
    • 一个比较特殊的类型NSError **一般用来在方法参数中返回错误信息,因此它总是默认为可空的指针指向可空的NSError引用。

    这方面的更多信息可以参考Error Handling Programming Guide




    参考链接:
    1.https://developer.apple.com/swift/blog/?id=25
    2.http://www.jianshu.com/p/20f43fa00ec3
    3.http://ios.jobbole.com/81910/
    4.http://honglu.me/2016/03/04/Cocoa%E4%B8%AD%E5%B8%B8%E7%94%A8%E7%9A%84%E5%AE%8F%E5%AE%9A%E4%B9%89/
  • 相关阅读:
    Java自学
    java自学
    每日总结
    每日总结
    每日总结
    每周总结
    每日总结
    每日总结
    每日总结
    每日总结
  • 原文地址:https://www.cnblogs.com/Jenaral/p/6169903.html
Copyright © 2020-2023  润新知