在 Xcode 6.3 中引入了新的注解,以更好地表达Objective-C中 API 的意图(当然也确保更好的 Swift 支持)。那些注释当然是nonnull
,nullable
和null_unspecified
.
但是在 Xcode 7 中,出现了很多警告,例如:
指针缺少可空性类型说明符(_Nonnull、_Nullable 或 _Null_unspecified)。
除此之外,Apple 使用另一种类型的可空性说明符,标记它们的 C 代码(源代码):
CFArrayRef __nonnull CFArrayCreate(
CFAllocatorRef __nullable allocator, const void * __nonnull * __nullable values, CFIndex numValues, const CFArrayCallBacks * __nullable callBacks);
所以,总而言之,我们现在有这 3 个不同的可空性注释:
nonnull
,nullable
,null_unspecified
_Nonnull
,_Nullable
,_Null_unspecified
__nonnull
,__nullable
,__null_unspecified
即使我知道为什么以及在哪里使用哪个注释,我还是对我应该使用哪种类型的注释、在哪里以及为什么使用感到有些困惑。这是我可以收集到的:
- 对于属性,我应该使用
nonnull
,nullable
,null_unspecified
. - 对于方法参数,我应该使用
nonnull
,nullable
,null_unspecified
. - 对于 C 方法,我应该使用
__nonnull
,__nullable
,__null_unspecified
. - 对于其他情况,例如双指针,我应该使用
_Nonnull
,_Nullable
,_Null_unspecified
.
但是我仍然对为什么我们有这么多基本上做同样事情的注释感到困惑。
所以我的问题是:
这些注释之间的确切区别是什么,如何正确放置它们以及为什么?