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