转自:https://www.jianshu.com/p/189aaa4dd498

_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

_Nullable等的用法和总结相关推荐

  1. iOS-class方法和objc_getClass方法

    根据上一篇博客iOS-class.object_getClass.objc_getClass.objc_getMetaClass区别的研究发现,发现主要还是class方法和objc_getClass方 ...

  2. nn.moduleList 和Sequential由来、用法和实例 —— 写网络模型

    对于cnn前馈神经网络如果前馈一次写一个forward函数会有些麻烦,在此就有两种简化方式,ModuleList和Sequential.其中Sequential是一个特殊的module,它包含几个子M ...

  3. JS中的call()方法和apply()方法用法总结

    1. 每个函数都包含两个非继承而来的方法:call()方法和apply()方法. 2. 相同点:这两个方法的作用是一样的. 都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖 ...

  4. MATLAB判断三角形成立的编程,Triangulation 划分三角形网络时用到的大量算法和测试例程 matlab 259万源代码下载- www.pudn.com...

    文件名称: Triangulation下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 213 KB 上传时间: 2016-05-24 下载次数: 0 详细说 ...

  5. ADPRL - 近似动态规划和强化学习 - Note 10 - 蒙特卡洛法和时序差分学习及其实例 (Monte Carlo and Temporal Difference)

    Note 10 蒙特卡洛法和时序差分学习 Monte Carlo and Temporal Difference 蒙特卡洛法和时序差分学习 Note 10 蒙特卡洛法和时序差分学习 Monte Car ...

  6. C语言的双向链表头插法和尾插法,指定节点删除

    文章目录 前言 头插法 尾插法 删除节点 测试代码如下 前言 双向链表和单链表的唯一区别就是多个一个指针域而已,该指针域可以访问链表的上一个节点. 关于构造双向链表的过程我们常见的有两种方法,和单链表 ...

  7. scanf()函数的用法和实践

    scanf()函数的用法和实践 摘要: 本文阐述了基于ANSI,Win 95,Win NT上的 C/C++语言中scanf()函数的用法,以及在实际使用中常见错误及对策. 关键词: scanf() 一 ...

  8. 线性回归介绍及分别使用最小二乘法和梯度下降法对线性回归C++实现

    回归:在这类任务中,计算机程序需要对给定输入预测数值.为了解决这个任务,学习算法需要输出函数f:Rn→R.除了返回结果的形式不一样外,这类问题和分类问题是很像的.这类任务的一个示例是预测投保人的索赔金 ...

  9. 接口设计文档_app端接口用例设计方法和测试方法(一)

    前言 接口测试作为测试的重要一环,重点关注的是数据层面的输入输出,今天小编介绍一种常用的接口测试用例设计方法和测试方法,希望对大家有所帮助,由于内容较多,分三次给大家讲解,今天先介绍"请求层 ...

最新文章

  1. 在 SQL Server 2K 中实现 大小写敏感的查询条件(WHERE ...),类似 Access(VB) 的 StrComp 函数...
  2. [RQNOJ313]波浪数
  3. 成功解决ValueError: DataFrame.dtypes for label must be int, float or bool
  4. C++ STL : 模拟实现STL中的关联式容器unordered_map/unordered_set
  5. REVERSE-COMPETITION-HGAME2022-Week4
  6. 今日头条新出算法大赛!短视频内容理解与推荐竞赛
  7. Error:Execution failed for task ':app:transformClassesWithDexForDebug'解决记录
  8. 等级VIN行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  9. 本示例主要展示如何在XtraGrid网格控件(包含在DevExpress WinForms套包中)的主视图中指定HyperLinkEdit控件作为列编辑器...
  10. 3小时GIS入门教程(二)GIS数据格式、坐标系
  11. 【学习笔记】SAP资产模块
  12. D11:Chickens and Rabbits(鸡兔同笼问题,附题解)
  13. 【WLAN】【基础知识】WIFI那些事儿之DFS
  14. 樊登读书赋能读后感_《赋能》读后感心得体会
  15. GNSS原理及技术(一)——GNSS现状与发展
  16. 华为怎么显示返回按键_华为怎么把返回那三个键调出来
  17. Fragment实例之微信界面
  18. 100天单词学习计划
  19. 韶音科技2021研究员面试经验
  20. 头部玩家指的是什么_什么是头部玩家,有没有一个定义?

热门文章

  1. [java]PixelShader:2d骨骼动画图帧编辑器
  2. 8小时快速入门,golang安装学习,有语言基础的快来学习
  3. 【swift】图片的编辑与合成
  4. Java 优秀博客汇总
  5. hdu3018 Ant Trip
  6. html+css+js 下拉菜单
  7. 《平如美棠》:相思始觉海非深
  8. MFC之GetDlgItem函数返回NULL的问题解决
  9. Servlet_W3School
  10. ASP.NET中 ValidationGroup[控件的属性]:分组验证的使用