Middle
Kā kompilators atrod metodi, kuru vajadzētu izsaukt?
sobes.tech AI
Atbilde no AI
Kompilators, izsaucot metodi:
- pārbauda metodes definīciju klasē un tās vecāku klasēs.
- ar statisku tipizāciju (kompilācijas laikā) nosaka, kurš metodes izsaukums ir pareizs, ja tas ir iespējams.
Vērtības laikā:
- tiek izmantots dinamiskās maršrutizācijas mehānisms.
- objekts glabā norādi uz savu klasi.
- klase glabā maršrutizācijas tabulu (method dispatch table), vai vtable C++/Objective-C, vai metožu tabulu (method table) Swift.
- tabula satur norādes uz metožu realizācijām.
- izsaucot metodi, izpildes vide meklē atbilstošo ierakstu objekta klases maršrutizācijas tabulā pēc selektora nosaukuma (Objective-C) vai metodes signatūras (Swift, virtuālajiem metodēm).
- atradusi ierakstu, tiek izsaukta metodes realizācijas norāde.
Objective-C tas izskatās šādi:
// Piemērs, kā izsaukt metodi Objective-C
// [target messageName:parameter];
// Runtime meklē 'messageName:' 'target'.class maršrutizācijas tabulā
Swift:
// Piemērs, kā izsaukt metodi Swift
// instance.methodName(parameter)
// Atkarībā no tipa (final class, struct, protocol, dynamic)
// tiek izmantota statiska vai dinamiska maršrutizācija (vtable vai message dispatch)
Swift maršrutizācijas tipi:
| Tips | Maršrutizācija | Optimizācija |
|---|---|---|
struct, enum |
Statiska | Kompilators zina precīzu metodi |
final class |
Statiska | Kompilators zina precīzu metodi |
class (ne final) |
Virtuāla | Per tabulu (vtable) |
protocol (bez @objc) |
Virtuāla | Per protokola liecinieka tabulu (protocol witness table) |
@objc (class, protocol) |
Dīnamiska | Per Objective-C izpildi (message dispatch) |