Estou (tentando) aprender Objective-C e continuo encontrando frases como:
-(id) init;
E eu entendo que id
é uma palavra-chave da linguagem Objective C, mas o que significa dizer "o compilador trata especificamente id
em termos das regras de conversão de tipo de ponteiro"?
Será que id
designará automaticamente o objeto à sua direita como um ponteiro?
objective-c
types
GPP
fonte
fonte
void*
Respostas:
id
é um ponteiro para qualquer tipo, mas, ao contráriovoid *
, sempre aponta para um objeto Objective-C. Por exemplo, você pode adicionar qualquer coisa do tipoid
a um NSArray, mas esses objetos devem responder aretain
erelease
.O compilador fica totalmente satisfeito por você lançar implicitamente qualquer objeto para
id
, e por você lançarid
para qualquer objeto. Isso é diferente de qualquer outra conversão implícita em Objective-C e é a base para a maioria dos tipos de contêiner em Cocoa.fonte
id
a definição de étypedef struct objc_object *id;
, portanto, aponta para umObjc
objeto.NSObject
? significa, posso substituirid
porNSObject
quando for um tipo de retorno?id
é um ponteiro para qualquer objeto Objective-C (objc_object
). Não é apenas um indicador vazio e você não deve tratá-lo como tal. Ele faz referência a um objeto que deve ter umisa
ponteiro válido . Os valores que podem ser armazenadosid
também não se limitamNSObject
ae seus descendentes, o que passa a dar sentido tanto à existência doNSObject
protocolo quanto àNSProxy
classe da qual nem mesmo herdaNSObject
. O compilador permitirá que você atribua um objeto referenciado por tipoid
a qualquer tipo de objeto, atribua qualquer tipo de objetoid
, bem como envie para ele qualquer mensagem (que o compilador tenha visto) sem aviso.fonte
id
é um tipo genérico. Isso significa que o compilador esperará qualquer tipo de objeto lá e não aplicará restrições. Pode ser útil se você espera usar mais de uma classe de objetos lá; você pode então usar a introspecção para descobrir de que classe se trata.id
assume automaticamente um ponteiro, já que todos os objetos em Objective-C são passados como ponteiros / referências.Alguns recursos adicionais:
id vs NSObject vs id *
Programação Objective-C (Wikibooks) Tipagem dinâmica de
introspecção
fonte
Em java ou c # usamos assim
mas no objetivo c
fonte
Sim e não. É verdade que
id x
designar x como um ponteiro, mas dizer que as regras de conversão de tipo de ponteiro se aplicam é errado, porque "id" tem regras especiais de conversão de tipo. Por exemplo, com umvoid *
ponteiro, você não pode fazer isso:Pelo contrário, é possível com id:
Veja mais uso do tipo id em exemplos de objetivo c .
Além disso, no Objective C "moderno", é preferível usar em
instancetype
vez de "id" nos métodos "init". Existe até uma ferramenta de conversão automática no Xcode para mudar isso. Leia sobre instancetype: seria benéfico começar a usar instancetype em vez de id?fonte