Sobes.tech
Intern

Cosa succede se si accede all'oggetto?

sobes.tech AI

Risposta dell'AI

Invia un messaggio a un oggetto. Se l'oggetto ha un metodo con il nome (selettore) corrispondente, verrà eseguito. In caso contrario, si verifica un errore di runtime (selettore non riconosciuto inviato all'istanza), a meno che l'oggetto non implementi un meccanismo di inoltro dei messaggi.

Il meccanismo di inoltro dei messaggi in Objective-C/Swift consiste in diverse fasi:

  1. Dispatch dinamico: l'ambiente di runtime cerca l'implementazione del metodo (IMP) per quel selettore nella classe dell'oggetto e nelle sue superclasse.
  2. Aggiunta dinamica di metodi: se l'implementazione non viene trovata, il runtime chiama il metodo +resolveInstanceMethod: (per le istanze) o +resolveClassMethod: (per le classi), per dare alla classe la possibilità di aggiungere dinamicamente l'implementazione del metodo.
  3. Inoltro dei messaggi: se il metodo non viene ancora trovato o aggiunto, il runtime tenta di inoltrare il messaggio a un altro oggetto, chiamando i metodi forwardingTargetForSelector: e poi methodSignatureForSelector: e forwardInvocation:.

Se nessuno di questi passaggi porta alla gestione del messaggio, si verifica un'eccezione NSInvalidArgumentException.

Esempio in Objective-C:

@implementation MyObject

- (void)myMethod {
    // Implementazione del metodo
    NSLog(@"myMethod called");
}

@end

// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Invio del messaggio myMethod

Esempio in Swift (nascosto):

class MySwiftObject {
    func mySwiftMethod() {
        // Implementazione del metodo
        print("mySwiftMethod called")
    }
}

let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Invio del messaggio mySwiftMethod (tramite dispatch dinamico di default)

L'accesso alle proprietà dell'oggetto in Swift di default utilizza il dispatch statico per let e var senza @objc dynamic. Tuttavia, se la proprietà è contrassegnata come @objc dynamic, l'accesso a essa utilizzerà anche il dispatch dinamico, simile all'invio di messaggi in Objective-C.