Qual é o significado de id?


97

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 idem termos das regras de conversão de tipo de ponteiro"?

Será que iddesignará automaticamente o objeto à sua direita como um ponteiro?


28
É o oposto do ego. Para algumas pessoas isso évoid*
Hot Licks

Aqui está uma discussão relevante para a pergunta: Pergunta SO
dmitri

Respostas:


122

idé um ponteiro para qualquer tipo, mas, ao contrário void *, sempre aponta para um objeto Objective-C. Por exemplo, você pode adicionar qualquer coisa do tipo ida um NSArray, mas esses objetos devem responder a retaine release.

O compilador fica totalmente satisfeito por você lançar implicitamente qualquer objeto para id, e por você lançar idpara 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.


11
Suplemento: id a definição de é typedef struct objc_object *id;, portanto, aponta para um Objcobjeto.
zhongwuzw

é o mesmo que NSObject? significa, posso substituir idpor NSObjectquando for um tipo de retorno?
ThunderWiring de


33

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 um isaponteiro válido . Os valores que podem ser armazenados idtambém não se limitam NSObjectae seus descendentes, o que passa a dar sentido tanto à existência do NSObjectprotocolo quanto à NSProxyclasse da qual nem mesmo herda NSObject. O compilador permitirá que você atribua um objeto referenciado por tipo ida qualquer tipo de objeto, atribua qualquer tipo de objeto id, bem como envie para ele qualquer mensagem (que o compilador tenha visto) sem aviso.


25

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. idassume 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


9
  • id é um tipo de dados de identificadores de objeto em Objective-C, que pode ser usado para um objeto de qualquer tipo, independentemente da classe que ele tenha. id é o supertipo final de todos os objetos.

Em java ou c # usamos assim

 Object data = someValue;


 String name =(Object)data;

mas no objetivo c

id data= someValue;



NSString *name= data;

5

Sim e não. É verdade que id xdesignar 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 um void *ponteiro, você não pode fazer isso:

void *x;
char *y = x; // error, this needs an explicit cast

Pelo contrário, é possível com id:

id x;
NSString *y = x;

Veja mais uso do tipo id em exemplos de objetivo c .

Além disso, no Objective C "moderno", é preferível usar em instancetypevez 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?

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.