Sobes.tech
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)