美文网首页
nullable与nonnull

nullable与nonnull

作者: 哎呀不错 | 来源:发表于2016-06-15 15:15 被阅读0次

    苹果在Xcode6.3出现了这一OC新特性,从字面上我们可以知道nullable表示该对象可以为空,nonnull表示该对象(或者属性)不可以为空。
    我们以前写代码的时候基本都是这样:

    @property (nonatomic, copy) NSString *name;
    

    在viewDidLoad方法里面:

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.name = nil;
    }
    

    按照上面写好像没什么问题,也没有警告。这时候进入系统的一些头文件,会发现@property中的修饰符多了一些东西。

    // 属性中
    @property(nullable, nonatomic, readonly, strong) UIView *viewIfLoaded;
    // 方法中
    - (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER;
    

    那么使用该修饰符来试一试,当写如下代码时:

    @interface ViewController ()
    @property (nonnull, nonatomic, copy) NSString *name;
    @end
    @implementation ViewController
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.name = nil; // 警告:Null passed to a callee that requires a non-null argument
        [self text1];
    }
    

    按照我们以前写的时候,这个时候是不会有警告的,也就是不加nonnull修饰符。所以可以得出一个结论,当我们不写nonnull/nullable的时候,那么系统默认nullable吗?

    @property (nonatomic, copy) NSString *name;
    

    然后我们在viewDidLoad方法里面写如下代码:

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.name = nil;
    }
    

    这里的话其实是没有警告的,那么到了这里其实有个疑问了,默认不写的话,就是nullable么???
    别着急,继续往下看!!!

    苹果为什么要出这一新特性?

    我们都知道苹果出了swift,swift中出了一种类型---optional(可选项),这里其实就对应了nonnull和nullable, nonnull对应的是非可选的(也就是不允许为空),nullable对应的是可选的(optional),也就是允许为空,当我们使用swift和OC混编的时候,我们在oc写的:

    @property (nonatomic, copy) NSString *name;
    

    在下一篇文章上我详细写到swift和OC的混编,这里不做过多解释!

    按照上面代码,我们swift文件里面访问这个”name“属性的时候,如果name是可选的,也就代表着会转化成nullable类型,如果name是不可选的,也就代表着会转化成nonnull类型:

    好了,这时候我们可以看到name的类型其实是”String!“类型。

    这里我们可以得出结论了: 在swift与OC混编的时候,不写nonnull/nullable,默认会生成非可选的,也就是nonnull....

    相关文章

      网友评论

          本文标题:nullable与nonnull

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