tutorial objective objective-c ios

objective-c - objective c tutorial



isa puntero en object-c (4)

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

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

Utiliza su puntero isa . 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 que apunte a esa clase. Se llama el puntero isa porque un objeto "es una" instancia de esa clase. Aunque probablemente nunca usará explícitamente el puntero isa, su existencia le da a Objective-C mucho de su poder.

Un objeto solo responde a un mensaje si su clase (señalada por su puntero isa) implementa el método asociado. Debido a que esto sucede en el tiempo de ejecución, XCode no siempre puede calcular en 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 responde, pero si no está seguro, permitirá que se genere la aplicación.

Si, por alguna razón (y hay muchas posibilidades), terminas enviando un mensaje a un objeto que no responde, tu aplicación lanzará una excepción. Así que el puntero isa es la razón del error de tiempo de ejecución . Revisemos detalles y ejemplos aquí: IOS - Objective-C - Excepciones y selectores no reconocidos

De esta referencia:

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

Por lo que pude entender al leer this y this , permite, por una parte, utilizar la introspección pero de una manera pragmática (desarrollo de iOS), ¿qué puede beneficiar un programador de conocer / comprender este indicador especial?


En un entorno de 64 bits, no se debe acceder al campo ISA de un objeto. El campo ISA ya no tiene 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 utilizar 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


isa apunta al objeto de clase por lo que esto funcionaría

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

Comprender cómo usar esto tendría algunos beneficios, como la introspección y las pruebas en los objetos de clase del objeto creado.


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 de isa , en términos prácticos, no se usa mucho a menos que esté pirateando el tiempo de ejecución para hacer algo especial. Esta guía tiene más información sobre cómo se utiliza en el tiempo de ejecución.

Realmente no deberías usar el isa directamente en el código de producción. Es como retainCount : es importante que lo entiendas, pero nunca debes llamarlo.