Com o Xcode 6.3, foram introduzidas novas anotações para expressar melhor a intenção das APIs no Objective-C (e para garantir melhor suporte Swift, é claro). Essas anotações eram nonnull
, é claro , nullable
e null_unspecified
.
Mas com o Xcode 7, existem muitos avisos, como:
O ponteiro está ausente em um especificador de tipo de nulidade (_Nonnull, _Nullable ou _Null_unspecified).
Além disso, a Apple usa outro tipo de especificadores de nulidade, marcando seu código C ( fonte ):
CFArrayRef __nonnull CFArrayCreate(
CFAllocatorRef __nullable allocator, const void * __nonnull * __nullable values, CFIndex numValues, const CFArrayCallBacks * __nullable callBacks);
Então, para resumir, agora temos essas três anotações de nulidade diferentes:
nonnull
,nullable
,null_unspecified
_Nonnull
,_Nullable
,_Null_unspecified
__nonnull
,__nullable
,__null_unspecified
Embora eu saiba por que e onde usar qual anotação, estou ficando um pouco confuso com o tipo de anotação que devo usar, onde e por que. Isto é o que eu pude reunir:
- Para propriedades que eu deveria usar
nonnull
,nullable
,null_unspecified
. - Para os parâmetros do método devo usar
nonnull
,nullable
,null_unspecified
. - Para os métodos c I deve usar
__nonnull
,__nullable
,__null_unspecified
. - Para outros casos, como ponteiros duplos devo usar
_Nonnull
,_Nullable
,_Null_unspecified
.
Mas ainda estou confuso sobre o motivo pelo qual temos tantas anotações que basicamente fazem a mesma coisa.
Então, minha pergunta é:
Qual é a diferença exata entre essas anotações, como colocá-las corretamente e por quê?