Wraz z Xcode 6.3 wprowadzono nowe adnotacje, aby lepiej wyrazić zamiar API w Objective-C (i oczywiście w celu zapewnienia lepszej obsługi Swift). Adnotacje te były oczywiście nonnull
, nullable
i null_unspecified
.
Ale w przypadku Xcode 7 pojawia się wiele ostrzeżeń, takich jak:
We wskaźniku brakuje specyfikatora typu dopuszczalności wartości null (_Nonnull, _Nullable lub _Null_unspecified).
Oprócz tego Apple używa innego typu specyfikatorów wartości null, oznaczając ich kod C ( źródło ):
CFArrayRef __nonnull CFArrayCreate(
CFAllocatorRef __nullable allocator, const void * __nonnull * __nullable values, CFIndex numValues, const CFArrayCallBacks * __nullable callBacks);
Podsumowując, mamy teraz te 3 różne adnotacje dopuszczalności wartości zerowej:
nonnull
,nullable
,null_unspecified
_Nonnull
,_Nullable
,_Null_unspecified
__nonnull
,__nullable
,__null_unspecified
Mimo że wiem, dlaczego i gdzie użyć której adnotacji, trochę się pogubiłem, jakiego typu adnotacje mam użyć, gdzie i dlaczego. Oto, co mogłem zebrać:
- Dla właściwości należy używać
nonnull
,nullable
,null_unspecified
. - Dla parametrów metody należy używać
nonnull
,nullable
,null_unspecified
. - Dla metod C powinno się używać
__nonnull
,__nullable
,__null_unspecified
. - W innych przypadkach, takich jak podwójne wskaźniki należy używać
_Nonnull
,_Nullable
,_Null_unspecified
.
Ale wciąż nie wiem, dlaczego mamy tak wiele adnotacji, które zasadniczo robią to samo.
Więc moje pytanie brzmi:
Jaka jest dokładna różnica między tymi adnotacjami, jak je poprawnie umieścić i dlaczego?