Middle
Kaip kompiliatorius suranda metodą, kurį reikia iškviesti?
sobes.tech AI
Atsakymas iš AI
Kompiliatorius, kviesdamas metodą:
- patikrina metodo apibrėžimą klasėje ir jos tėvų klasėse.
- naudodamas statinį tipavimą (kompiliacijos metu), nustato, kuris metodas turi būti iškviestas, jei tai įmanoma.
Vykdymo metu:
- naudojamas dinaminės maršrutizacijos mechanizmas.
- objektas saugo nuorodą į savo klasę.
- klasė saugo maršrutizacijos lentelę (method dispatch table), arba vtable C++/Objective-C, arba metodų lentelę (method table) Swift.
- lentelė turi nuorodas į metodų įgyvendinimus.
- kviečiant metodą, vykdymo aplinka ieško atitinkamos įrašo klasės maršrutizacijos lentelėje pagal selektoriaus pavadinimą (Objective-C) arba metodo parašą (Swift, virtualiems metodams).
- radusi įrašą, kviečiama metodo įgyvendinimo nuoroda.
Objective-C tai atrodo taip:
// Pavyzdys, kaip kviečiama metodas Objective-C
// [target messageName:parameter];
// Runtime ieško 'messageName:' 'target'.class maršrutizacijos lentelėje
Swift:
// Pavyzdys, kaip kviečiama metodas Swift
// instance.methodName(parameter)
// Priklausomai nuo tipo (final class, struct, protocol, dynamic)
// naudojama statinė arba dinaminė maršrutizacija (vtable arba message dispatch)
Swift maršrutizacijos tipai:
| Tipas | Maršrutizacija | Optimizacija |
|---|---|---|
struct, enum |
Statinė | Kompiliatorius žino tikslią metodą |
final class |
Statinė | Kompiliatorius žino tikslią metodą |
class (ne final) |
Virituali | Per lentelę (vtable) |
protocol (be @objc) |
Virituali | Per protokolo liudijimo lentelę (protocol witness table) |
@objc (class, protocol) |
Dinaminė | Per Objective-C vykdymo (message dispatch) |