Ich habe einige Isa getestet, die mit Swift sprudeln , und festgestellt, dass es nur funktioniert, wenn NSObject eine Superklasse ist (direkt oder weiter oben) oder indem ich die '@objc'-Dekoration verwende. Andernfalls folgt es einem statischen und vtable-Versandstil wie C ++.
Ist es normal, eine Swift-Klasse ohne eine Cocoa / NSObject-Basisklasse zu definieren? Wenn es mich betrifft, bedeutet dies, auf einen Großteil der Dynamik von Objective-C zu verzichten, wie z. B. das Abfangen von Methoden und die Introspektion zur Laufzeit.
Das dynamische Laufzeitverhalten steht im Mittelpunkt von Funktionen wie Eigenschaftsbeobachtern, Kerndaten, aspektorientierter Programmierung , Messaging höherer Ordnung , Analyse- und Protokollierungsframeworks usw.
Durch die Verwendung des Methodenaufrufstils von Objective-C werden einem Methodenaufruf etwa 20 Maschinencode-Operanden hinzugefügt , sodass in bestimmten Situationen ( viele enge Aufrufe von Methoden mit kleinen Körpern ) der statische und vtable-Versand im C ++ - Stil eine bessere Leistung erzielen kann.
Ist es angesichts der allgemeinen 95-5-Regel ( 95% der Leistungssteigerungen stammen aus der Optimierung von 5% des Codes ) nicht sinnvoll, mit den leistungsstarken dynamischen Funktionen zu beginnen und bei Bedarf zu härten?