Разница между Nullable, __nullable и _Nullable в Objective-C
С Xcode 6.3 появились новые аннотации для лучшего выражения намерений API вObjective-C (и для обеспечения лучшей поддержки 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
.Но я все еще не понимаю, почему у нас так много аннотаций, которые в основном делают одно и то же.
Итак, мой вопрос:
В чем разница между этими аннотациями, как правильно их разместить и почему?