Разница между 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.

Но я все еще не понимаю, почему у нас так много аннотаций, которые в основном делают одно и то же.

Итак, мой вопрос:

В чем разница между этими аннотациями, как правильно их разместить и почему?

Ответы на вопрос(3)

Ваш ответ на вопрос