Während ich an einem Open-Source-Projekt arbeitete, stieß ich auf folgende Deklaration und Implementierung der C-Funktion:
%Vor% Dieses Beispiel könnte leicht als Klassenmethode ohne Probleme überschrieben werden. So wie es ist, erfordert die Verwendung von stringFormMimeType()
sill das Importieren der Header-Datei FSNData
sowieso.
Betrachten Sie die Apple Docs , es heißt nur:
Da Objective-C auf einer Grundlage von ANSI C beruht, können Sie frei C-Code mit Objective-C-Code mischen. Außerdem, dein Code kann Funktionen aufrufen, die in programminternen Nicht-Cocoa-Schnittstellen definiert sind, z wie die BSD-Bibliothek Schnittstellen in / usr / include.
Es wird nicht erwähnt, wann C-Funktionen Objective-C-Methoden bevorzugen sollten.
Der einzige Vorteil, den ich an dieser Stelle sehen kann, ist, dass beim Aufruf der obigen Funktion im Gegensatz zu einer Klassenmethode einige Objective-C-Laufzeitaufrufe übersprungen würden. In einem typischen Anwendungsfall von FSNData
würde dies dem Benutzer (wahrscheinlich sogar für Entwickler) * keine merkliche Leistungssteigerung bringen.
Welchen Vorteil gibt es (außer dem Codierungsstil), um eine C-Funktion gegenüber einer Klassenmethode zu bevorzugen?
* FSNData
wird als Teil der FSNetworking -Bibliothek verwendet. Daher bezweifle ich, dass es tausende von Netzwerkoperationen geben würde während des Lebenszyklus einer Anwendung durchgeführt werden.
Kurz gesagt, C (oder C ++) Implementierungen sind sehr nützlich:
Welchen Vorteil gibt es (außer dem Codierungsstil), um eine C-Funktion gegenüber einer Klassenmethode zu bevorzugen?
Natürlich werden Sie nicht immer dafür bezahlen, dass Sie für Dinge bezahlen, die Sie nicht brauchen oder verwenden - und denken Sie daran, dass ObjC-Klassenmethoden auch einige Vorteile gegenüber C-Funktionen haben. Betrachten Sie C- oder C ++ - Implementierungen als ein weiteres Tool in Ihrer Toolbox. Ich finde sie sehr nützlich, da die Komplexität und die Projektgrößen zunehmen, und sie können verwendet werden, um Ihre Programme viel schneller zu machen. Mach einfach das, was du 2015 am wenigsten bereuen wirst;)
Sie haben bereits den marginalen Leistungsunterschied zum Vermeiden eines objc_msgSend
-Aufrufs angesprochen. Objective-C-Klassenmethoden können auch in Unterklassen überschrieben werden, sodass das Implementieren einer Methode in C verhindert, dass sie in einer Unterklasse überschrieben wird. Aufgrund dieser Laufzeitvererbung / Polymorphie kann eine Objective-C-Methode niemals inline sein, während eine C-Funktion möglicherweise vom Compiler für zusätzliche Leistung eingebunden werden kann.
Wenn es darum geht, objc_msgSend
zu vermeiden, sagte mir einmal ein weiser Mann: "Wenn der Overhead von objc_msgSend
für Sie zu groß ist, ist Objective-C wahrscheinlich das falsche Werkzeug für den Job."
Tags und Links c objective-c function class-method