Qual é o significado de id?

Eu estou (tentando) aprender Objective-C e continuo encontrando uma frase como:

-(id) init; 

E eu entendo id é uma palavra-chave da linguagem Objective C, mas o que significa dizer “o compilador trata especificamente id em termos de regras de conversão de tipo de ponteiro”?

O id designa automaticamente o object à sua direita como um ponteiro?

id é um ponteiro para qualquer tipo, mas ao contrário de void * ele sempre aponta para um object Objective-C. Por exemplo, você pode adicionar qualquer coisa do tipo id a um NSArray, mas esses objects devem responder para retain e release .

O compilador está totalmente feliz por você implicitamente converter qualquer object para id , e para você converter id para qualquer object. Isso é diferente de qualquer outro lançamento implícito em Objective-C, e é a base para a maioria dos tipos de contêineres em cocoa.

id é um ponteiro para qualquer object Objective-C ( objc_object ). Não é apenas um ponteiro vazio e você não deve tratá-lo assim. Ele faz referência a um object que deve ter um ponteiro isa válido. Os valores que podem ser armazenados no id também não estão limitados apenas ao NSObject e seus descendentes, o que começa a dar sentido à existência do protocolo NSObject , bem como à class NSProxy que nem mesmo herda do NSObject . O compilador permitirá que você atribua um object referenciado por type id a qualquer tipo de object, atribua qualquer tipo de object a id , assim como envie qualquer mensagem (que o compilador tenha visto) sem aviso.

id é um tipo genérico. Isso significa que o compilador esperará qualquer tipo de object e não aplicará restrições. Pode ser útil se você estiver esperando usar mais de uma class de objects; Você pode então usar a introspecção para descobrir qual class é. id assume automaticamente um ponteiro, pois todos os objects em Objective-C são passados ​​como pointers / referências.

Alguns resources adicionais:
id vs NSObject vs id *
Programação Objetivo-C (Wikilivros)
Introspecção
Digitação Dinâmica

  • id é um tipo de dados de identificadores de object em Objective-C, que pode ser usado para um object de qualquer tipo, não importando qual class ele tenha. id é o último tipo super de todos os objects.

Em java ou c # usamos assim

  Object data = someValue; String name =(Object)data; 

mas no objective c

 id data= someValue; NSString *name= data; 

Sim e não. É verdade que ter id x designa x como um ponteiro, mas dizer que as regras de conversão de tipo de ponteiro se aplicam está errado, porque “id” tem regras de conversão de tipo especiais. Por exemplo, com um ponteiro void * 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 nos exemplos de c objective .

Além disso, no “moderno” Objetivo C, é preferível usar instancetype vez de “id” em methods “init”. Existe até uma ferramenta de conversão automática no Xcode para mudar isso. Leia sobre instancetype: Seria benéfico começar usando instancetype em vez de id?