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?

GPP
fonte
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.

joerick
fonte
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
Documento da
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.

Joe
fonte
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

FeifanZ
fonte
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;
ChancyWu
fonte
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?

battlmonstr
fonte