Sobes.tech
Intern

¿Qué sucederá si se accede al objeto?

sobes.tech AI

Respuesta de la IA

Enviar un mensaje a un objeto. Si el objeto tiene un método con el nombre (selector) correspondiente, se ejecutará. Si no, se producirá un error en tiempo de ejecución (selector no reconocido enviado a la instancia), a menos que el objeto implemente un mecanismo de reenvío de mensajes.

El mecanismo de reenvío de mensajes en Objective-C/Swift consta de varias etapas:

  1. Despacho dinámico: El entorno de ejecución busca la implementación del método (IMP) para ese selector en la clase del objeto y sus superclases.
  2. Adición dinámica de métodos: Si no se encuentra la implementación, el entorno de ejecución llama al método +resolveInstanceMethod: (para instancias) o +resolveClassMethod: (para clases), para dar la oportunidad a la clase de agregar dinámicamente la implementación del método.
  3. Reenvío de mensajes: Si el método no se encuentra ni se añade, el entorno de ejecución intenta reenviar el mensaje a otro objeto, llamando a los métodos forwardingTargetForSelector: y luego methodSignatureForSelector: y forwardInvocation:.

Si ninguno de estos pasos resulta en el manejo del mensaje, se produce una excepción NSInvalidArgumentException.

Ejemplo en Objective-C:

@implementation MyObject

- (void)myMethod {
    // Implementación del método
    NSLog(@"myMethod called");
}

@end

// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Envío del mensaje myMethod

Ejemplo en Swift (implícito):

class MySwiftObject {
    func mySwiftMethod() {
        // Implementación del método
        print("mySwiftMethod called")
    }
}

let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Envío del mensaje mySwiftMethod (a través de la despacho dinámico por defecto)

El acceso a las propiedades del objeto en Swift por defecto usa despacho estático para let y var sin @objc dynamic. Sin embargo, si la propiedad está marcada como @objc dynamic, el acceso a ella también usará despacho dinámico, similar al envío de mensajes en Objective-C.