¿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:
- 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.
- 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. - 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 luegomethodSignatureForSelector:yforwardInvocation:.
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.