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, nullabley 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é?
