Š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:
- Dinamičko distribuiranje: Okruženje za izvršavanje traži implementaciju metode (IMP) za taj selektor u klasi objekta i njegovim superklasama.
- 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. - 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 zatimmethodSignatureForSelector:iforwardInvocation:.
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.