В 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
.
Но я все еще не понимаю, почему у нас так много аннотаций, которые в основном делают одно и то же.
Итак, мой вопрос:
В чем разница между этими аннотациями, как правильно их разместить и почему?