Unterschied zwischen Framework und statischer Bibliothek in xcode4 und wie man sie aufruft

133

Ich bin ziemlich neu in Xcode und Objective-C. Ich möchte eine sehr grundlegende Frage stellen.

Ich habe gesehen, dass es beim "Verknüpfen von Binärdateien mit Bibliotheken" in den Projekteinstellungen Unterschiede zwischen Framework und Bibliotheken gibt, die aus anderen Projekten im Arbeitsbereich importiert wurden.

Erste Frage, warum gibt es einen Rahmen? Und warum gibt es eine Bibliothek? Kann meine Bibliothek kein Framework sein?

Und wie kann ich dann aus einer .h- Datei Klassen aus meiner importierten statischen Bibliothek aufrufen?

Ich nehme an, es muss ein Präfix geben, aber ich konnte es nicht finden. Weder "ProjName / Myclass.h" funktionieren.

Bitte seien Sie so genau wie möglich.

Vielen Dank

Leonardo
quelle
Keine grundlegende Frage
Masih

Antworten:

140

Der größte Vorteil eines Frameworks gegenüber statischen Bibliotheken besteht darin, dass sie die kompilierte Bibliotheksbinärdatei und alle zugehörigen Header auf übersichtliche Weise verpacken. Sie können in Ihr Projekt eingefügt werden (genau wie die in das SDK integrierten Frameworks wie Foundation und UIKit) und sollten (meistens) einfach funktionieren.

Die meisten Frameworks enthalten dynamische Bibliotheken. In Xcode mithilfe der Mac Framework-Vorlage erstellte Frameworks erstellen eine dynamische Bibliothek. Das iPhone unterstützt keine dynamischen Frameworks, weshalb es üblich geworden ist, wiederverwendbare Bibliotheken mit iOS-Code stattdessen als statische Bibliotheken zu verteilen.

Statische Bibliotheken sind in Ordnung, erfordern jedoch einige zusätzliche Arbeit seitens des Benutzers. Sie müssen Ihr Projekt mit der Bibliothek verknüpfen und die Header-Dateien in Ihr Projekt kopieren oder irgendwo darauf verweisen, indem Sie in Ihren Build-Einstellungen die entsprechenden Header-Suchpfade festlegen.

Zusammenfassend lässt sich sagen, dass die beste Art, Ihre Bibliothek zu verteilen, ein Framework ist. Um ein "statisches" Framework für iOS zu erstellen, können Sie im Wesentlichen ein normales Framework verwenden und die Binärdatei durch Ihre kompilierte statische Bibliothek ersetzen. Auf diese Weise verteile ich eine meiner Bibliotheken, Resty, und beabsichtige, meine Bibliotheken in Zukunft zu verteilen.

Vielleicht möchten Sie sich die mitgelieferte Rake-Datei in diesem Projekt ansehen (falls Sie sich nicht bewusst sind, ist Rake Rubys Äquivalent zu Make). Ich habe eine Handvoll Aufgaben, um mein Projekt zu kompilieren (mit xcodebuild) und es als statisches Framework für iOS zu verpacken. Sie sollten dies nützlich finden.

Alternativ können Sie diese Xcode 4-Vorlagen zum Erstellen eines iOS-Frameworks verwenden.

Update 9. Dezember 2013 : Dies ist eine beliebte Antwort, daher dachte ich, ich würde sie bearbeiten, um zu sagen, dass sich meine erste Wahl für die Bibliotheksverteilung geändert hat. Meine erste Wahl für eine Drittanbieter-Bibliothek als Verbraucher oder Produzent ist CocoaPods. Ich verteile meine Bibliotheken mit CocoaPods und biete eine vorkompilierte statische Bibliothek mit Headern als Fallback-Option an.

Luke Redpath
quelle
1
Bibliotheken können also entweder statisch und dynamisch sein, und Frameworks sind einfach eine Gruppe von Bibliotheken, die auch dynamisch oder statisch sein können. Ist das das richtige Verständnis?
Tony
Es scheint, dass Sie mit dem Xcode-Framework-Ziel auch Header kopieren, aber keine Ressourcen bündeln können. Können verteilte statische Bibliotheken auch Header enthalten?
Tony
Folgefrage: Ist es wichtig, ob Sie ein Framework mit Debug oder Distribution erstellt haben? Denn sonst hat Distribution einen geringeren Platzbedarf.
Aldrich Co
2
@ GoRoS ja das tue ich; Tatsächlich habe ich gerade für einen Kunden gearbeitet, der sein privates SDK mit CocoaPods verfügbar gemacht hat. Der Trick besteht darin, ein öffentliches Repo mit der kompilierten statischen Bibliothek, den Headern und der Podspec zu haben, die darauf verweisen, und ein privates Repo mit Ihrer Quelle. Idealerweise verfügen Sie über eine Art CI / Automatisierung, mit der Sie Ihr privates Repo überprüfen, Ihr öffentliches Repo kompilieren und aktualisieren und die beiden synchron halten können. Verwenden Sie Tags, um aktuelle versionierte Releases im öffentlichen Repo zu kennzeichnen (und wahrscheinlich auch im privaten Repo, damit Sie wissen, mit welchem ​​Quell-Commit die öffentliche Version erstellt wurde).
Luke Redpath
1
@LukeRedpath Ihre Lösung mit CI klingt ziemlich ideal ... kennen Sie einen guten Artikel / Blog mit einem Tutorial, wie man es einrichtet? Idealerweise mit Jenkins
micromanc3r
19

Grundsätzlich sind Frameworks Bibliotheken und bieten einen praktischen Mechanismus für die Arbeit mit ihnen. Wenn Sie in ein Framework "schauen", ist es nur ein Verzeichnis, das eine statische Bibliothek und Header-Dateien enthält (in einigen Ordnerstrukturen mit Metadaten).

Wenn Sie Ihr eigenes Framework erstellen möchten, müssen Sie eine "statische Bibliothek" erstellen und diese auf eine bestimmte Weise packen. siehe diese Frage

Im Allgemeinen werden Framworks auf Plattformen für wiederverwendbares Verhalten verwendet, bei dem Sie Ihren eigenen Code "in ein vorhandenes Framework" einfügen. Wenn Sie bestimmte Funktionen haben möchten, können Sie eine Bibliothek (z. B. three20) verwenden und diese in Ihre verteilbare App packen

Martin Ullrich
quelle
1
Beachten Sie, dass ein Framework keine statische Bibliothek enthalten muss. Unter Mac OS X enthalten die meisten Frameworks keine statischen Bibliotheken, sondern dynamische Bibliotheken.
danke, es ist klar, aber wie kann ich eine Klasse in einer statischen Bibliothek aus einer .m-Datei heraus aufrufen? Reicht es aus, #import "MyClass.h" aufzurufen und "Binärdateien mit Bibliotheken verknüpfen" hinzuzufügen?
Leonardo
@Bavarious du hast recht ich hätte nur "Bibliotheken" schreiben sollen ^^; Dennoch gibt es fast jedes Framework ohne Bibliotheken. In den meisten Fällen verknüpfen Sie es mit einem Framework zum Kompilieren, und die Bibliothek ist auf dem Zielsystem vorhanden. Dies ist wieder diese Sache zwischen Verhalten und Funktionalität
Martin Ullrich
@ Leonardo ja, im Grunde ist es das, was du tun musst. Stellen Sie einfach sicher, dass sich die .h-Dateien irgendwo in Ihrem Pfad befinden. Wenn Sie das XCode-Projekt der Bibliothek haben, können Sie das Projekt und sein Ziel als Abhängigkeit einbeziehen, damit Sie mehr Debugging-Funktionen und die .h-Dateien in Ihrem Pfad erhalten
Martin Ullrich
Ich bin verwirrt, ich dachte, Ihre Antwort war richtig, aber ich sah sie als "-1" markiert?!?!?! Zweitens ist die Bibliothek Teil eines Arbeitsbereichs und vom Hauptprojekt aus korrekt verknüpft. Aber ich bekomme immer noch "Klasse nicht gefunden" in Zeile '#import "MyClass.h"' beim Erstellen der Anwendung. Ich weiß, dass es einen Trick gibt, damit es funktioniert.
Leonardo