1,nonnull和nullable
声明属性是否可以为nil,如果对nonnull属性赋值为nil,则会报警告。
1 2 3 | @property (nonatomic, strong, nonnull) NSArray *array1; @property (nonatomic, strong) NSArray * __nullable array2; |
作用主要是开发者之间交互,调用属性时可以知道这个属性是可能为nil的,针对这个状态做些处理。
默认情况下就是nullable状态。
可以用来给方法的参数最要求,比如定一个方法,参数为一个不为空的对象:
2,null_resettable
声明属性set方法可以为nil,但是get一定不能为nil,这里有一个貌似冲突的地方,就是可以定义个属性为nil,但是在获取这个属性的时候,这个属性不能为nil,否则会有警告。
这里用到的地方例如在UIViewController中的view,意味着开发者可以对控制器的view清空赋值为nil,但是控制器view是懒加载的,每次获取控制器的view时候,都可以再获取到非nil的view。
一个Objective-C的新特性:nullability annotations。这一新特性的核心是两个新的类型注释:__nullable和__nonnull。从字面上我们可以猜到,__nullable表示对象可以是NULL或nil,而__nonnull表示对象不应该为空。当我们不遵循这一规则时,编译器就会给出警告。
不过这只是一个警告,程序还是能编译通过并运行。
事实上,在任何可以使用const关键字的地方都可以使用__nullable和__nonnull,不过这两个关键字仅限于使用在指针类型上。而在方法的声明中,我们还可以使用不带下划线的nullable和nonnull