Avec Xcode 6.3, de nouvelles annotations ont été introduites pour mieux exprimer l'intention des API en Objective-C (et pour assurer un meilleur support Swift bien sûr). Ces annotations étaient bien sûr nonnull
, nullable
et null_unspecified
.
Mais avec Xcode 7, de nombreux avertissements apparaissent tels que:
Le pointeur n'a pas de spécificateur de type de nullabilité (_Nonnull, _Nullable ou _Null_unspecified).
En plus de cela, Apple utilise un autre type de spécificateurs de nullabilité, marquant leur code C ( source ):
CFArrayRef __nonnull CFArrayCreate(
CFAllocatorRef __nullable allocator, const void * __nonnull * __nullable values, CFIndex numValues, const CFArrayCallBacks * __nullable callBacks);
Donc, pour résumer, nous avons maintenant ces 3 annotations de nullabilité différentes:
nonnull
,nullable
,null_unspecified
_Nonnull
,_Nullable
,_Null_unspecified
__nonnull
,__nullable
,__null_unspecified
Même si je sais pourquoi et où utiliser quelle annotation, je ne sais pas trop quel type d'annotations dois-je utiliser, où et pourquoi. Voici ce que je pourrais comprendre:
- Pour les propriétés que je devrais utiliser
nonnull
,nullable
,null_unspecified
. - Pour les paramètres de la méthode que je devrais utiliser
nonnull
,nullable
,null_unspecified
. - Pour les méthodes C je devrais utiliser
__nonnull
,__nullable
,__null_unspecified
. - Pour d' autres cas, comme doubles pointeurs que je devrais utiliser
_Nonnull
,_Nullable
,_Null_unspecified
.
Mais je ne comprends toujours pas pourquoi nous avons tant d'annotations qui font essentiellement la même chose.
Ma question est donc:
Quelle est la différence exacte entre ces annotations, comment les placer correctement et pourquoi?