Con Xcode 6.3 sono state introdotte nuove annotazioni per esprimere meglio l'intenzione delle API in Objective-C (e per garantire un miglior supporto rapido, ovviamente). Quelle annotazioni erano ovviamente nonnull
, nullable
e null_unspecified
.
Ma con Xcode 7, appaiono molti avvisi come:
Nel puntatore manca un identificatore del tipo di nullability (_Nonnull, _Nullable o _Null_unspecified).
Inoltre, Apple utilizza un altro tipo di identificatori di nullability, contrassegnando il loro codice C ( sorgente ):
CFArrayRef __nonnull CFArrayCreate(
CFAllocatorRef __nullable allocator, const void * __nonnull * __nullable values, CFIndex numValues, const CFArrayCallBacks * __nullable callBacks);
Quindi, per riassumere, ora abbiamo queste 3 diverse annotazioni di nullability:
nonnull
,nullable
,null_unspecified
_Nonnull
,_Nullable
,_Null_unspecified
__nonnull
,__nullable
,__null_unspecified
Anche se so perché e dove utilizzare quale annotazione, mi sto confondendo leggermente con quale tipo di annotazioni dovrei usare, dove e perché. Questo è ciò che potrei raccogliere:
- Per le proprietà devo usare
nonnull
,nullable
,null_unspecified
. - Per i parametri del metodo devo usare
nonnull
,nullable
,null_unspecified
. - Per i metodi C devo usare
__nonnull
,__nullable
,__null_unspecified
. - Per gli altri casi, come ad esempio doppi puntatori devo usare
_Nonnull
,_Nullable
,_Null_unspecified
.
Ma sono ancora confuso sul perché abbiamo così tante annotazioni che sostanzialmente fanno la stessa cosa.
Quindi la mia domanda è:
Qual è la differenza esatta tra quelle annotazioni, come posizionarle correttamente e perché?