Objective C-Klassenmethoden vs. C-Funktionen

8

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.

    
Mike D 22.09.2013, 20:43
quelle

2 Antworten

7

Kurz gesagt, C (oder C ++) Implementierungen sind sehr nützlich:

  • Für Abstraktion
  • Für Wiederverwendbarkeit
  • Bei mittleren und großen Programmen
  • In leistungskritischen Pfaden
  • Für 'Interior'-Implementierungen
  

Welchen Vorteil gibt es (außer dem Codierungsstil), um eine C-Funktion gegenüber einer Klassenmethode zu bevorzugen?

  • ObjC-Messaging führt indirekte Funktionsaufrufe ein. Dies sind Firewalls für Optimierer.
  • C-Funktionen können den Zugriff einfach einschränken, während "private" ObjC-Implementierungen mithilfe der ObjC-Laufzeit gesucht oder versehentlich außer Kraft gesetzt werden können.
  • C-Funktionen können aus Ihrer ausführbaren Datei entfernt werden, wenn sie nicht referenziert werden, oder sie können als privat gekennzeichnet werden. Wenn Sie wiederverwendbaren Code schreiben (und Sie sollten), kann dies einen großen Einfluss auf Ihre Binärgrößen und Ladezeiten haben - C-Funktionen, die nicht referenziert / verwendet werden, können entfernt werden, aber ObjC-Typen und Methoden bleiben erhalten Referenz). Aus diesem Grund kann die binäre Größe Ihrer Anwendung erheblich zunehmen, wenn Sie nur einen kleinen Teil einer statischen ObjC-Bibliothek verwenden - jede objc-Klasse in der Bibliothek bleibt erhalten. Wenn diese Bibliothek C oder C ++ wäre, dann könnten Sie mit sehr geringem Wachstum auskommen, weil Sie nur das brauchen, was referenziert wird. Was ist oder was nicht, ist leichter mit C und C ++ zu beweisen.
  • C-Funktionen können entweder während der Kompilierung oder während der Optimierung der Link-Zeit-Phasen eingebunden werden.
  • Der Compiler und die Optimierer können viel mit C-Funktionen optimieren (z. B. inter-prozedurale Optimierungen), aber sehr wenig mit ObjC-Methoden, weil sie immer indirekt sind.
  • Um den Overhead der ObjC-Nachrichtenübertragung zu vermeiden (wie Sie bereits erwähnt haben)
  • Potenzial für zusätzliche Referenzzählvorgänge und automatische Freigabepoolaktivität bei der Interaktion mit ObjC-Objekten.

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;)

    
justin 22.09.2013, 22:55
quelle
8

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."

    
ipmcc 22.09.2013 21:36
quelle