_Nullable等的用法和总结

_Nullable等用法
__nullable 和__nonnull。从字面上我们可知, __nullable 表示对象可以是 NULL 或 nil,而 __nonnull 表示对象不应该为空。当我们不遵循这一规则时,编译器就会给出警告。在 Xcode 7 中,为了避免与第三方库潜在的冲突,苹果把 __nonnull/__nullable改成 _Nonnull/_Nullable。再加上苹果同样支持了没有下划线的写法 nonnull/nullable ,于是就造成现在有三种写法这样混乱的局面。

但是这三种写法本质上都是互通的,只是放的位置不同,举例如下:

方法返回值修饰:

- (nullable NSString*)method ;
- (NSString*  __nullable)method2 ;
- (NSString* _Nullable)method3 ;

声明属性的修饰:

@property(nonatomic, copy, nullable) NSString *aString;
@property(nonatomic, copy) NSString* __nullable aString;
@property(nonatomic, copy) NSString* _Nullable aString;

方法参数修饰:

- (void)methodWithString:(nullable NSString *)aString;
- (void)methodWithString:(NSString  *_Nullable)aString;
- (void)methodWithString:(NSString *__nullable)aString;

而对于双指针类型对象 、 Block 的返回值 、 Block 的参数 等,这时候就不能用 nonnull/nullable 修饰,只能用带下划线的 __nonnull / __nullable 或者 _Nonnull/_Nullable

- (void)methodWithError:(NSError *_Nullable *_Nullable)error;
- (void)methodWithError:(NSError * __nullable * __null_unspecified)error;
// 以及其他的组合方式
- (void)methodWithBlock:(nullable id __nonnull(^)(id __nullable params))block;
- (void)methodWithBlock:(id __nonnull(^ __nullable)(id __nullable params))block;
- (void)methodWithBlock:(id _Nonnull (^ _Nullable)(id _Nullable params))block;

归纳:
对于属性、方法返回值、方法参数的修饰,使用: nonnull/nullable ;
对于 C 函数的参数、Block 的参数、Block 返回值的修饰,使用: _Nonnull/_Nullable

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 技术无极限,从菜鸟开始,从源码开始。 由于公司目前项目还是用OC写的项目,没有升级swift 所以暂时SDWebI...
    充满活力的早晨阅读 12,681评论 0 2
  • 字一叠叠摞着 在看得见的地方 情绪结成块 颠簸着修长又寂寞的道路 我们找不出相同的日子 找不出两朵同时盛放又同时死...
    MelissaJiang阅读 275评论 0 1
  • 我的姥姥生了两个女儿——姨母和我的母亲。 按照天津人的老话说“姐姐妹妹老亲人”。但是据我看来,母亲这姐妹两个竟是一...
    万方清仪阅读 1,755评论 0 1
  • 好多时候我们有好多奇思妙想,好多特别的想法,我们有梦想要去完成,我们有古怪设计,但大多数的它们都被埋藏在心里,没有...
    Lj刘小爷阅读 1,088评论 0 0
  • 前几天写了一篇有关如何语言学习的文章,在简书小热门了几天,因此结缘认识了一些共同学习的小伙伴,共同学习,共同进步。...
    漫步西班牙idealife阅读 14,474评论 193 498