Sobes.tech
Intern

Co się stanie, jeśli odwołasz się do obiektu?

sobes.tech AI

Odpowiedź od AI

Wyślij wiadomość do obiektu. Jeśli obiekt ma metodę o odpowiedniej nazwie (selektorze), zostanie ona wywołana. Jeśli nie, wystąpi błąd wykonania (nieznany selektor wysłany do instancji), chyba że obiekt implementuje mechanizm przekazywania wiadomości.

Mechanizm przekazywania wiadomości w Objective-C/Swift składa się z kilku etapów:

  1. Dynamiczne dispatchowanie: Środowisko wykonawcze szuka implementacji metody (IMP) dla tego selektora w klasie obiektu i jej superklasach.
  2. Dynamiczne dodawanie metod: Jeśli implementacja nie zostanie znaleziona, środowisko wykonawcze wywołuje metodę +resolveInstanceMethod: (dla instancji) lub +resolveClassMethod: (dla klas), aby umożliwić klasie dynamiczne dodanie implementacji metody.
  3. Przekazywanie wiadomości: Jeśli metoda nadal nie została znaleziona lub dodana, środowisko wykonawcze próbuje przekazać wiadomość innemu obiektowi, wywołując metody forwardingTargetForSelector: i następnie methodSignatureForSelector: i forwardInvocation:.

Jeśli żaden z tych etapów nie obsłuży wiadomości, wystąpi wyjątek NSInvalidArgumentException.

Przykład w Objective-C:

@implementation MyObject

- (void)myMethod {
    // Implementacja metody
    NSLog(@"myMethod called");
}

@end

// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Wysyłanie wiadomości myMethod

Przykład w Swift (domyślny):

class MySwiftObject {
    func mySwiftMethod() {
        // Implementacja metody
        print("mySwiftMethod called")
    }
}

let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Wysyłanie wiadomości mySwiftMethod (przez domyślny dispatch dynamiczny)

Dostęp do właściwości obiektu w Swift domyślnie używa statycznego dispatch dla let i var bez @objc dynamic. Jednak, jeśli właściwość jest oznaczona jako @objc dynamic, dostęp do niej również będzie korzystał z dispatch dynamicznego, podobnie jak wysyłanie wiadomości w Objective-C.