С Xcode 6.3 появились новые аннотации для лучшего выражения намерения API в Objective-C (и, конечно же, для лучшей поддержки Swift). Эти аннотации были, конечно, nonnull
, nullable
и null_unspecified
.
Но с Xcode 7 появляется много предупреждений, таких как:
У указателя отсутствует спецификатор типа nullability (_Nonnull, _Nullable или _Null_unspecified).
В дополнение к этому, Apple использует другой тип спецификаторов нулевой вероятности, отмечая свой код C (источник):
CFArrayRef __nonnull CFArrayCreate(
CFAllocatorRef __nullable allocator, const void * __nonnull * __nullable values, CFIndex numValues, const CFArrayCallBacks * __nullable callBacks);
Итак, чтобы подвести итог, теперь у нас есть эти три разных аннотации нулевой вероятности:
-
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
.
Но я все еще смущен тем, почему у нас так много аннотаций, которые в основном делают то же самое.
Итак, мой вопрос:
Что такое точное различие между этими аннотациями, как правильно их разместить и почему?