借助Xcode 6.3,引入了新的注释,以便更好地表达Objective-C中API的意图(当然可以确保更好的Swift支持)。这些注解当然nonnull
是nullable
和null_unspecified
。
但是使用Xcode 7时,会出现很多警告,例如:
指针缺少可为空类型说明符(_Nonnull,_Nullable或_Null_unspecified)。
除此之外,Apple使用另一种可为空性说明符,标记其C代码(source):
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
。
但是对于为什么我们有这么多基本上执行相同操作的注释,我仍然感到困惑。
所以我的问题是:
这些注释之间的确切区别是什么?如何正确放置它们?为什么?