Con Xcode 6.3, se introdujeron nuevas anotaciones para expresar mejor la intención de las API en Objective-C (y para garantizar un mejor soporte de Swift, por supuesto). Esas anotaciones eran, por supuesto nonnull
, nullable
y null_unspecified
.
Pero con Xcode 7, aparecen muchas advertencias como:
Al puntero le falta un especificador de tipo de nulabilidad (_Nnnull, _Nullable o _Null_unspecified).
Además de eso, Apple usa otro tipo de especificadores de nulabilidad, marcando su código C ( fuente ):
CFArrayRef __nonnull CFArrayCreate(
CFAllocatorRef __nullable allocator, const void * __nonnull * __nullable values, CFIndex numValues, const CFArrayCallBacks * __nullable callBacks);
En resumen, ahora tenemos estas 3 anotaciones de nulabilidad diferentes:
nonnull
`nullable
`null_unspecified
_Nonnull
`_Nullable
`_Null_unspecified
__nonnull
`__nullable
`__null_unspecified
Aunque sé por qué y dónde usar qué anotación, me confundo un poco qué tipo de anotaciones debo usar, dónde y por qué. Esto es lo que podría reunir:
- Para las propiedades que debe utilizar
nonnull
,nullable
,null_unspecified
. - Para los parámetros del método que debe utilizar
nonnull
,nullable
,null_unspecified
. - Para los métodos de C I deberán utilizar
__nonnull
,__nullable
,__null_unspecified
. - Para otros casos, como punteros dobles que debería utilizar
_Nonnull
,_Nullable
,_Null_unspecified
.
Pero todavía estoy confundido sobre por qué tenemos tantas anotaciones que básicamente hacen lo mismo.
Entonces mi pregunta es:
¿Cuál es la diferencia exacta entre esas anotaciones, cómo colocarlas correctamente y por qué?