З 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
.
Але я все ще плутаюсь, чому у нас так багато приміток, які в основному роблять те саме.
Отже, моє питання:
Яка точна різниця між цими анотаціями, як їх правильно розмістити і чому?