转自: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. 【物联网】NB-IoT简介
  2. 30天敏捷结果(27):做些有重要意义的事
  3. linux 调用 fudanNLP
  4. NGUI: UIPanel控件
  5. 触发器deleted 表和 inserted 表详解(转)
  6. HarmonyOS之sdkmgr命令的使用
  7. TensorFlow:实战Google深度学习框架(五)图像识别与卷积神经网络
  8. 【Linux基础】压缩和解压
  9. Windows 7中的远程桌面增强(Graphics Remoting, Remote Desktop)
  10. 数据科学 IPython 笔记本 7.15 高性能 Pandas
  11. webpack2.0构建Reactjs基础工程
  12. java销毁servlet_「销毁session」Servlet销毁session - seo实验室
  13. 【转载】20种PLC对应Modbus地址表
  14. 鼠标键盘录制工具 脚本录制器 游戏脚本录制工具
  15. U2000V200R018 的安装教程我们用微软的Windows7专业版示例
  16. 软件工程--总体设计过程包括那些步骤---软件设计过程中应该遵循那些基本原理--模块独立性
  17. 阿里安全人机行为识别比赛 前五名队伍分享
  18. Staking来袭,10亿级市场打开! | 火星总编时刻NO.31
  19. 001,Python微信接龙脚本与腾讯会议定时挂网课脚本
  20. 学习笔记:全局变量定义“无须”初始化,局部变量必须初始化

热门文章

  1. 阿里云万网域名解析免费教程
  2. 深圳云计算培训:带你在Linux的世界翱翔
  3. 3.1-3.31推荐文章汇总
  4. 移动web-空间转换
  5. VirtualBox 共享文件夹没有执行权限解决方法
  6. C语言打印出心形表白,520神器,初学者也能看懂!!
  7. 朋友圈发图多大不会被压缩_孕期多吃四类食物,生出来的宝宝颜值通常不会低,眼睛大皮肤也好...
  8. 2022第七届少儿模特明星盛典 代言人陈颢天 T台风采展示
  9. JavaScript学习笔记(一轮)完结
  10. 北京大学数据科学计算机科学与技术,北大考博辅导:北京大学数据科学(计算机科学与技术)考博难度解析及经验分享...