苹果在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....