zoukankan      html  css  js  c++  java
  • 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/
  • 相关阅读:
    iSCSI又称为IPSAN
    文档类型定义DTD
    HDU 2971 Tower
    HDU 1588 Gauss Fibonacci
    URAL 1005 Stone Pile
    URAL 1003 Parity
    URAL 1002 Phone Numbers
    URAL 1007 Code Words
    HDU 3306 Another kind of Fibonacci
    FZU 1683 纪念SlingShot
  • 原文地址:https://www.cnblogs.com/Jenaral/p/6169903.html
Copyright © 2011-2022 走看看