前言
__nullable 和 __nonnull 。从字面上我们可知, __nullable 表示对象可以是 NULL 或 nil,而__nonnull 表示对象不应该为空。当我们不遵循这一规则时,编译器就会给出警告。在 Xcode 7 中,为了避免与第三方库潜在的冲突,苹果把 __nonnull/__nullable改成 _Nonnull/_Nullable 。再加上苹果同样支持了没有下划线的写法 nonnull/nullable ,于是就造成现在有三种写法这样混乱的局面。但是这三种写法本质上都是互通的,只是放的位置不同,举例如下:
总结:
对于属性、方法返回值、方法参数的修饰,使用:nonnull/nullable;
对于 C 函数的参数、Block 的参数、Block 返回值的修饰,使用:_Nonnull/_Nullable,建议弃用__nonnull/__nullable。
example:
@property(copy,nonamatic,nullable)NSString* ID;
- (nullable NSString*)getID;
- (void)setIDS:(nullable NSString*)ID;
- (void)methoeWithBlock:(void(^ _Nullable)()))block;