NS_ASSUME_NONNULL_BEGIN -- NS_AS
2019-12-10 本文已影响0人
程序员学哥
在我们创建一个类的时候在.h文件中Xcode自动生成这两个东西
NS_ASSUME_NONNULL_BEGIN
...
NS_ASSUME_NONNULL_END
- 下面咱们来看一下它代表什么意思:
实际这两个东西并非一个完全新的概念,它代表的意思是从NS_ASSUME_NONNULL_BEGIN 到 NS_ASSUME_NONNULL_END之间定义的对象都是 __nonnull 不可为空的。以前也有这样的概念只不过是 Xcode 10 之后系统默认实现了, 应该是考虑到与 Swift 混编, 为了更好兼容其 optional 与 non-optional。开发者不用再自己的去将每个属性或方法都去指定nonnull和nullable,大大减轻了开发的工作量。
- 源码定义NSObjectRuntime.h
#ifndef NS_ASSUME_NONNULL_BEGIN
#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
#endif
#ifndef NS_ASSUME_NONNULL_END
#define NS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end")
- 除此之外苹果还制定了以下几条规则(为了安全):
1.比较复杂的指针类型(如id *)必须在定义的时候表明标明是nonnull还是nullable。
比如:
指定一个指向nullable对象的nonnull指针,可以使用”__nullable id * __nonnull”来进行修饰。
2.NSError对象通常是被假定为一个指向可为空的nullable ,所以NSError对象的nullable指针还需要设置。
3.因为typedef的特性通常依赖于上下文,它定义的类型的是nullability(typeof(COREVIDEO_DECLARE_NULLABILITY)),即使是在NS_ASSUME_NONNULL_BEGIN 到 NS_ASSUME_NONNULL_END之间也不能假定它为nonnull。