Sobes.tech
Intern

Šta će se dogoditi ako pristupite objektu?

sobes.tech АИ

Одговор од АИ

Pošaljite poruku objektu. Ako objekat ima metodu sa odgovarajućim imenom (seletor), ona će biti izvršena. Ako ne, doći će do greške u izvršenju (neprepoznat selektor poslat instanci), osim ako objekat ne implementira mehanizam za preusmeravanje poruka.

Mehanizam preusmeravanja poruka u Objective-C/Swift sastoji se od nekoliko etapa:

  1. Dinamičko distribuiranje: Okruženje za izvršavanje traži implementaciju metode (IMP) za taj selektor u klasi objekta i njegovim superklasama.
  2. Dinamičko dodavanje metoda: Ako implementacija nije pronađena, okruženje za izvršavanje poziva metodu +resolveInstanceMethod: (za instance) ili +resolveClassMethod: (za klase), da bi omogućilo klasi da dinamički doda implementaciju metode.
  3. Preusmeravanje poruka: Ako metoda i dalje nije pronađena ili dodata, okruženje za izvršavanje pokušava da preusmeri poruku na drugi objekat, pozivajući metode forwardingTargetForSelector: i zatim methodSignatureForSelector: i forwardInvocation:.

Ako nijedan od ovih koraka ne reši poruku, javlja se izuzetak NSInvalidArgumentException.

Primer u Objective-C:

@implementation MyObject

- (void)myMethod {
    // Implementacija metode
    NSLog(@"myMethod called");
}

@end

// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Slanje poruke myMethod

Primer u Swift (implicitno):

class MySwiftObject {
    func mySwiftMethod() {
        // Implementacija metode
        print("mySwiftMethod called")
    }
}

let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Slanje poruke mySwiftMethod (kroz dinamičko distribuiranje po defaultu)

Pristup svojstvima objekta u Swift-u po default-u koristi statičko distribuiranje za let i var bez @objc dynamic. Međutim, ako je svojstvo označeno kao @objc dynamic, pristup mu će takođe koristiti dinamičko distribuiranje, slično slanju poruka u Objective-C.