2012-06-12 12 views
13

De esta referencia:puntero del ISA en Objective-C

Cuando se crea un nuevo objeto, la memoria para que se le asigna, y sus variables de instancia se inicializan. La primera entre las variables del objeto es un puntero a su estructura de clase. Este puntero, llamado isa, otorga a el acceso de objeto a su clase y, a través de la clase, a todas las clases de las que hereda.

Por lo que pude entender la lectura y thisthis, que permite, por ejemplo, utilizar la introspección pero de una manera pragmática (desarrollo IOS), lo que puede un beneficio programador de saber/entender este puntero especial?

+7

léelo como "es un". "myObj es una instancia de MyClass" – vikingosegundo

+0

¿tiene ejemplo, qué es un puntero isa por favor? – user454083

Respuesta

16

El beneficio real es una mejor comprensión del tiempo de ejecución de Objective-C, que en realidad es bastante complejo en comparación con los lenguajes estáticos como C++. El puntero isa, en términos prácticos, no se usa mucho a menos que esté pirateando el tiempo de ejecución para hacer algo especial. This guide tiene más información sobre cómo es utilizado por el tiempo de ejecución.

No debería realmente utilizar el isa directamente en el código de producción. Es como retainCount; es importante que lo entiendas pero nunca deberías llamarlo.

+2

+1 para la guía. Como muchas personas que dedican un tiempo al stackoverflow, me gusta saber "qué tan profundo va el agujero del conejo". – Peres

+0

¡El tiempo de ejecución de Objective-C es muy similar! No importa cuánto aprendas, probablemente haya algo más, incluso si se trata de un comportamiento o práctica matizada. –

0

isa apunta al objeto de clase así que esto iba a funcionar

if(self->isa == [self class]) 
    NSLog(@"True"); 

La comprensión de cómo usar esto, tendría algunas ventajas, tales como la introspección y pruebas sobre los objetos de la clase del objeto creado

+3

No recomendaría usar esto; 'if ([self isKindOfClass: [self class]])' es un enfoque mucho mejor, incluso si la comprobación de la igualdad del puntero de objetos 'Class' es técnicamente correcta. –

+3

@AshFurrow ¿qué piensas 'isKindOfClass:' utiliza para implementar su comportamiento ...? ;) – Jasarien

+3

¡Por supuesto! Pero eso está bajo el capó. Al igual que no debe llamar '.cxx_destruct' o' objc_msgSend' usted mismo. –

4

En el entorno de 64 bits, no se debe acceder al campo ISA de un objeto. El campo ISA ya no contiene un puntero. Incluye algunos datos de puntero y utiliza los bits restantes para contener otra información de tiempo de ejecución. La propiedad CLASS o la función OBJECT_GETCLASS se pueden usar para leer un campo isa. OBJECT_SETCLASS se puede usar para escribir un campo isa.

Ref: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html#//apple_ref/doc/uid/TP40013501-CH3-SW1

2

En tiempo de ejecución, cuando se envía un mensaje a un objeto, ese objeto va a la clase que lo creó y le dice: ". Me enviaron este mensaje Ejecutar el código del método de emparejamiento " Esto es diferente a la mayoría del lenguaje de compilación, donde el método a ejecutar se determina en tiempo de compilación.


¿CÓMO SABE UN OBJETO QUE CLASE LO CREA?

Utiliza su isa puntero. Cada objeto tiene una variable de instancia llamada isa. Cuando se crea un objeto, la clase establece la variable de instancia isa del objeto de retorno para señalar hacia atrás en esa clase. Se llama puntero isa porque un objeto "es una instancia" de esa clase. Aunque probablemente nunca uses explícitamente el puntero isa, su existencia le otorga a Objective-C gran parte de su poder.


Un objeto sólo responde a un mensaje si su clase (apuntado por su puntero ISA) implementa el método asociado. Debido a que esto ocurre en tiempo de ejecución, XCode no siempre puede determinar en el tiempo de compilación (cuando se construye la aplicación) si un objeto responderá a un mensaje.XCode le dará un error si cree que está enviando un mensaje a un objeto que no responderá, pero si no está seguro, permitirá que la aplicación se genere.


Si, por alguna razón (y hay muchas posibilidades), se termina el envío de un mensaje a un objeto que no responde, su solicitud será lanzado una excepción. Por lo tanto, el isa puntero es el motivo de error de tiempo de ejecución. Veamos los detalles y el ejemplo aquí: IOS - Objective-C - Exceptions And Unrecognized Selectors

Cuestiones relacionadas