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 , nullablee 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ê?
