Wie funktioniert iOS Swift-Runtime arbeiten
In ObjC
ist es mit Messaging
, static binding
, dynamic typing
, dynamic binding
, dynamic method resolution
, dynamic loading
, introspector
und so weiter.
Allem die core-Methode objc_msgSend
ist verantwortlich für die Aufnahme der Selektor, den Sie senden, und das Objekt, Sie senden es an, und schaut sich in der Klasse-Methode-Tabellen, um genau herauszufinden, welches Stück code sollte es zu handhaben.
Meine Bedenken hier sind:
-
Ist
Swift
etwas ähnliches wieObjC
auf Laufzeit? -
Wie funktioniert
Swift runtime
finden Sie den code zur Implementierung für ein Objekt/Klassen-Methode? -
In
ObjC
,classes
undobjects
kompiliert werden einigeruntime types
wieC struct
auf Laufzeit. Was sollen dann solcheclasses
undobjects
kompiliert zur Laufzeit inSwift
? -
Tut
Swift runtime
so etwas wieclass /meta class /isa pointer /super pointer
?
- Können Sie ein Beispiel geben?
- Was ich antwortete, ist in Bezug auf #1 & #2. In Bezug auf #3 & #4 ich bin mir sicher, dass die Swift hat definitiv etwas, aber das ist nicht stabilisiert. Zunächst gab es Pläne zur Stabilisierung ABI im Swift-3.0-Version, aber Flugzeuge geändert werden: infoq.com/news/2016/05/swift-3-no-stable-abi
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurz, es sind Statische und Dynamische Arten von Methode call-dispatching.
Statisch - die Funktion Adresse aufgerufen werden, ist bestimmt in der Kompilierung, so dass die Kosten solcher Aufruf ist ähnlich zu C-Funktion aufrufen. Dieser Mechanismus wird verwendet für
private
Methoden oderfinal
Klassen-Methoden call-dispatching.Dynamic dispatching ist mechinism die es erlaubt, zu implementieren Polymorphismus-Konzept der OOP - die Funktion Adresse aufgerufen werden, ist bestimmt in der Laufzeit. Swift hat zwei Subtypen des er:
2.1. Obj-C - Sie bereits beschrieben, ist die Frage. Dieser Mechanismus wird verwendet, wenn Objekt erbt von NSObject oder aufrufende Methode hat @objc-Präfix.
2.2. Virtuelle Tabelle basiert (wie in C++) - es ist ähnlich Zeuge Tabellen. Was es tut, bei Aufruf der Methode dispatching ist nur eine einzige arithmetische operation - die Berechnung der eigentlichen Funktion Adresse basierend auf der Funktion offset in der Basisklasse Zeuge Tabelle und die Objekt-Klasse-Zeugnis Tabelle Lage. Also das ist eine relativ billige operation im Vergleich zu Obj-C. Es erklärt, warum die "reinen" Swift entspricht in C++ Leistung.
Wenn Sie nicht Kennzeichnen Sie die Methode mit
private
keyword oder Ihre Klasse nichtfinal
und gleichen Zeit, die Sie Klasse, ist "Reine" Swift (erbt es nicht NSObject) dann diese virtuelle Tabelle, basierend Mechanismus verwendet wird. Es bedeutet, dass alle Methoden standardmäßig sindvirtual
.P. S.
Nützlicher link für den Beweis meiner vision bezüglich der "Arten":
https://developer.apple.com/swift/blog/?id=27
"Subtypen" Erklärung basiert auf meinem Verständnis.