2012-09-28 8 views
6

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?

+0

No hay asterisco en 'class' ya sea“puntero ISA.”. – kennytm

Respuesta

11

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

Cuestiones relacionadas