Diferencia entre nullable, __nullable y _Nullable en Objective-C

Con Xcode 6.3 se introdujeron nuevas anotaciones para expresar mejor la intención de las API enC objetivo (y para garantizar un mejor soporte de Swift, por supuesto). Esas anotaciones fueron, por supuestononnull, nullable ynull_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 debo usarnonnull, nullable, null_unspecified.Para los parámetros del método debería usarnonnull, nullable, null_unspecified.Para los métodos C debería usar__nonnull, __nullable, __null_unspecified.Para otros casos, como los punteros dobles, debería usar_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é?

Respuestas a la pregunta(4)

Su respuesta a la pregunta