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