Sobes.tech
Intern

Mis juhtub, kui pöördute objekti poole?

sobes.tech AI

Vastus AI-lt

Sõnum saadetakse objekti. Kui objektil on vastava nimega (selektori) meetod, siis see täidetakse. Kui mitte, toimub täitmise viga (unrecognized selector sent to instance), välja arvatud juhul, kui objekt ei rakenda sõnumite edastamise mehhanismi:

Sõnumite edastamise mehhanism Objective-C/Swiftis koosneb mitmest etapist:

  1. Dünaamiline dispetcher: täitmise keskkond otsib meetodi (IMP) realiseerimist selle selektori jaoks objekti klassis ja selle superklassides.
  2. Dünaamiline meetodite lisamine: Kui realiseerimist ei leita, kutsub täitmise keskkond välja +resolveInstanceMethod: (näidiste jaoks) või +resolveClassMethod: (klasside jaoks), andes klassile võimaluse meetodi realiseerimist dünaamiliselt lisada.
  3. Sõnumite edastamine: Kui meetod ikka veel ei leidu või ei ole lisatud, püüab täitmise keskkond edastada sõnumi teisele objektile, kutsudes välja forwardingTargetForSelector: ja seejärel methodSignatureForSelector: ning forwardInvocation:.

Kui ükski neist etappidest ei too sõnumi töötlemist, toimub erind NSInvalidArgumentException.

Objective-C näide:

@implementation MyObject

- (void)myMethod {
    // Meetodi realiseerimine
    NSLog(@"myMethod called");
}

@end

// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Sõnumi saatmine myMethod

Swift (varjatud) näide:

class MySwiftObject {
    func mySwiftMethod() {
        // Meetodi realiseerimine
        print("mySwiftMethod called")
    }
}

let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Sõnumi saatmine mySwiftMethod (dünaamilise dispetcheriga vaikimisi)

Swiftis objekti omadustele viitamine kasutab vaikimisi staatilist dispetcherit let ja var ilma @objc dynamic märgistuseta. Kui omadus on märgitud @objc dynamic, kasutab sellele viitamine samuti dünaamilist dispetcherit, sarnaselt Objective-C sõnumite saatmisega.