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:
- Dynamiczne dispatchowanie: Środowisko wykonawcze szuka implementacji metody (IMP) dla tego selektora w klasie obiektu i jej superklasach.
- 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. - 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ępniemethodSignatureForSelector:iforwardInvocation:.
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.