Mi comprensión del tipo Objective-C id
es que es un puntero a un objeto de tipo desconocido. En mi opinión, es como un vacío * para las clases de Objective-C con un poco de azúcar en el compilador para cosas como la verificación de tipos. Mi pregunta es ¿por qué no es id*
en lugar de id
ya que es un tipo de puntero? Si esto fuera Java o C# donde las referencias de objeto no se declaran usando un *
, entonces no estaría tan sorprendido. Pero en Objective-C, todas las clases están referenciadas por punteros estilo C, entonces, ¿por qué ocultar el *
para el tipo de objeto desconocido?¿Por qué el tipo de identificación en Objective-C omite el asterisco?
Respuesta
El id typedef
ya es un puntero:
typedef struct objc_object {
Class isa;
} *id;
Desde el Objective-C Programming Language:
En Objective-C, identificadores de objeto son de un tipo de datos distinto:
id
. Este tipo es el tipo general para cualquier clase de objeto independientemente de la clase y se puede usar para instancias de una clase y para objetos de clase .id anObject;
Para las construcciones orientadas a objetos de Objective-C, tales como valores de retorno método, ID reemplaza int como el tipo de datos predeterminado. (Para estrictamente construcciones de C, como valores de retorno de función, int sigue siendo el tipo predeterminado.)
El nil palabra clave se define como un objeto nulo, un id con un valor de 0. Identificación, nil, y el otros tipos básicos de Objective-C se definen en el archivo de encabezado objc/objc.h.
id se define como puntero a una estructura de datos de objetos:
typedef struct objc_object {
Class isa;
} *id;
Cada objeto tiene así una variable de ISA que le dice de lo que la clase es una instancia. Dado que el tipo de clase es en sí definido como un puntero:
typedef struct objc_class *Class;
la variable
isa
es con frecuencia conoce como el
- 1. ¿Por qué ReadDirectoryChangesW omite eventos?
- 2. ¿Por qué EnumChildWindows omite niños?
- 3. ¿Por qué Subversion omite archivos que contienen el símbolo @?
- 4. ¿Por qué el miembro OwningThread de CRITICAL_SECTION de tipo HANDLE, cuando indica la identificación del hilo?
- 5. ¿Por qué Haskell tiene el "tirón de identificación" tiene este tipo?
- 6. urlencode() el 'asterisco' (estrella?) Carácter
- 7. ¿Por qué mi depurador C# omite puntos de interrupción?
- 8. ¿Por qué necesito asterisco antes de una matriz?
- 9. ¿por qué usamos el tipo @Master?
- 10. ¿Por qué el tipo (classInstance) devuelve 'instancia'?
- 11. Etiqueta de script HTML: tipo o idioma (u omite ambos)?
- 12. Por qué lanzar/convertir de int devuelve un asterisco
- 13. obteniendo el error "invalid_client" en la muestra gdata-objectivec-client
- 14. Identificación de tipo de archivo en Java
- 15. ¿Por qué foreach omite la verificación del tipo de tiempo de compilación en los tipos de interfaz?
- 16. Punteros en C: ¿cuándo usar el signo y el asterisco?
- 17. Identificación de ubicaciones geográficas en el texto
- 18. CSS: ¿Qué hace este Asterisco (*)?
- 19. Identificación de tipo de archivo en Windows
- 20. tipo de identificación a NSString
- 21. el comportamiento de "Identificación const"
- 22. ¿RavenDB optimiza internamente el tipo de consultas "obtener documento por identificación"?
- 23. ¿Por qué fold tiene el siguiente tipo en Scala?
- 24. Bloques ObjectiveC equivalente en Java
- 25. ¿Por qué el compilador no realiza una conversión de tipo?
- 26. ¿Por qué se rompe el tipo Complex de .NET?
- 27. Genéricos de Java: ¿Por qué Map.get() Ignora el tipo?
- 28. Arte de asterisco en python
- 29. ¿Por qué el tipo de javascript siempre devuelve "objeto"?
- 30. ¿Por qué GHCi no puede resolver el tipo de [[]]?
No hay asterisco en 'class' ya sea“puntero ISA.”. – kennytm