Ein Leitfaden zum Erstellen Ihrer eigenen Bibliothek für die Cocoa(touch)-Entwicklung

Lesezeit: 6 Minuten

Ich verwende derzeit viele der gleichen untergeordneten Objekte mit benutzerdefinierten Methoden. Es wäre bequemer zu Erstellen Sie meine eigene Bibliothek, die ich für mehrere Projekte verwenden kann.

Das Ziel ist, dass meine eigenen Klassen genauso verfügbar sind wie Klassen UIView, CGRect usw. sind, einschließlich bequemer Methoden wie CGRectMake, sowohl mit Klassen als auch mit Strukturen. Zusammenfassend möchte ich meine eigenen Äquivalente erstellen von:

  • Klassen wie UIView
  • Strukturen wie CGRect
  • Praktische Funktionen wie CGRectMake
  • Halten Sie diese als Bibliothek bereit
  • Stellen Sie dies als XCode-Vorlage zur Verfügung, sodass diese benutzerdefinierten Objekte als „neue Dateien“ in XCode verfügbar sind

Im Grunde suche ich also nach Anweisungen zum Erstellen von Klassen, Strukturen usw., um alle oben genannten zu erstellen. Was ist der beste Weg, dies zu tun? Das 320 Projekt scheint ein guter Ausgangspunkt zu sein. Aber es fehlt (glaube ich) an:

  • die Bibliothek sofort in neuen Projekten verfügbar zu haben
  • die neuen Klassen unter ‘neue Datei’ verfügbar zu haben

Selbst wenn ich eine eigene statische Bibliothek erstellen würde, Kann ich die App im App Store veröffentlichen?da das Verknüpfen mit Bibliotheken von Drittanbietern auf dem Telefon nicht unterstützt wird?

Der Einfachheit halber sind dies im Grunde die Unterfragen, die den Umfang dieser Frage abdecken:

  • Wie kann ich meine eigene Bibliothek für die Mac-/iPhone-Entwicklung erstellen?
  • Wie erstelle ich Klassen, Strukturen und Inline-Funktionen für diese Bibliothek?
  • Wie erstelle ich meine eigene Xcode-Vorlage basierend auf dieser Bibliothek?
  • Kann ich iPhone-Apps mit meiner eigenen statischen Bibliothek veröffentlichen?

FYI Xcode 3.2 hat eine neue Projektvorlage namens Cocoa Touch Static Library. Vielleicht möchten Sie diesen Weg gehen.

Wenn Sie dies für einen Mac tun würden, würden Sie ein Framework erstellen. Sie erwähnen jedoch UIView, also arbeitest du offensichtlich mit dem iPhone. Apple erlaubt nicht, dass iPhone-Anwendungen zur Laufzeit dynamisch mit anderen Bibliotheken verknüpft werden, daher besteht Ihre einzige Möglichkeit darin, eine statische Bibliothek zu erstellen. Eine statische Bibliothek wird beim Erstellen mit der ausführbaren Datei der Anwendung verknüpft.

Meines Wissens gibt es in Xcode keine statische Bibliotheksprojektvorlage. Was Sie wahrscheinlich tun müssen, ist, mit einer anderen iPhone Xcode-Vorlage zu beginnen und ein statisches Bibliotheksziel hinzuzufügen. Halten Sie am Standardanwendungsziel fest; Sie können damit eine einfache Testanwendung erstellen, um sicherzustellen, dass die Bibliothek tatsächlich funktioniert.

Um die Bibliothek tatsächlich in einer Anwendung zu verwenden, benötigen Sie zwei Dinge: die kompilierte Bibliothek (sie hat die Erweiterung .a) und alle Header-Dateien. In Ihrer fertigen Anwendung verlinken Sie mit Ihrer statischen Bibliothek, und das müssen Sie auch #import die Header-Dateien, damit der Compiler versteht, welche Klassen, Funktionen usw. ihm zur Verfügung stehen. (Eine gängige Technik besteht darin, eine Header-Datei zu erstellen, die alle anderen importiert. Auf diese Weise müssen Sie nur eine einzige Datei in Ihre Quelldateien importieren.)

Was das Erstellen Ihrer eigenen benutzerdefinierten Vorlagen betrifft, gibt es hier ein einfaches Tutorial, das Ihnen den Einstieg erleichtern sollte: http://www.macresearch.org/custom_xcode_templates Sie können wahrscheinlich die Standardvorlagen kopieren und sie einfach an Ihre Zwecke anpassen.

Die Struct-Syntax sieht folgendermaßen aus:

typedef struct _MyPoint {
    CGFloat x;
    CGFloat y;
} MyPoint;

Strukturen werden in Header-Dateien deklariert, sodass Sie (glaube ich) Befehl + Doppelklick auf den Namen einer Struktur ausführen können, um zu sehen, wie sie deklariert ist.

Ein weiterer kleiner Trick zum Erstellen von Strukturen besteht darin, Folgendes zu tun:

MyPoint aPoint = (MyPoint){ 1.5f, 0.25f };

Da der Compiler die Reihenfolge der Felder in der Struktur kennt, kann er die Werte, die Sie in den geschweiften Klammern angeben, sehr einfach mit den entsprechenden Feldern abgleichen. Natürlich ist es bequemer, eine Funktion wie zu haben MyPointMakealso kannst du das so schreiben:

MyPoint MyPointMake(CGFloat x, CGFloat y) 
    return (MyPoint){ x, y };
}

Beachten Sie, dass dies eine Funktion ist, keine Methode, also lebt sie außerhalb von irgendetwas @interface oder @implementation Kontext. Obwohl ich nicht glaube, dass sich der Compiler beschwert, wenn Sie ihn in einer definieren @implementation Kontext.

CGPointMake ist definiert als das, was als bekannt ist inline Funktion. Die Definition dafür finden Sie auch in den Cocoa-Header-Dateien. (Der Unterschied zwischen einer Inline-Funktion und einer normalen Funktion besteht darin, dass der Compiler eine ersetzen kann Anruf zu CGPointMake mit einer Kopieren von CGPointMake, wodurch der Aufwand für einen Funktionsaufruf vermieden wird. Es ist eine ziemlich kleine Optimierung, aber für eine so einfache Funktion macht es Sinn.)

  • Vielen Dank! Das hilft sehr. Eine Frage aber; Das Instanziieren von MyPoint mit bequemen Methoden wie ‘MyPointMake(x,y)’ (als ‘CGRectMake(x,y,width,height)’) ist immer noch möglich?

    – Krim

    25. März 2009 um 14:54 Uhr

  • In C99 (das Sie in den Build-Einstellungen festlegen können) können Sie ein zusammengesetztes Literal verwenden: (MyPoint){ x, y }. Das funktioniert auch für Objective-C, solange Sie es auf C99 setzen. Wenn Sie wirklich eine Funktion wollen, ist das natürlich möglich. Du musst natürlich deine eigenen schreiben.

    – Peter Hosey

    25. März 2009 um 15:05 Uhr

Das 320 Projekt ist ein gutes Beispiel für eine iPhone-Klassenbibliothek. Sie kompilieren Ihr Projekt grundsätzlich in eine .a-Bibliothek und verknüpfen diese dann statisch in Ihren Client-Projekten.

  • Ich habe mir das mal angeschaut, aber ich komme damit nicht klar. Könnten Sie das näher erläutern?

    – Krim

    25. März 2009 um 14:08 Uhr

  • Er gibt hier ziemlich detaillierte Anweisungen: github.com/joehewitt/three20/tree/master Was genau verstehst du nicht?

    – zog

    25. März 2009 um 14:55 Uhr

  • Ich habe nicht aufgehört zu verstehen, wie ich die Dinge tun soll, die ich in der Frage angegeben habe. Aber jetzt ist es klar. Danke an die Gemeinde. Die Anleitung ist in der Tat ziemlich ausführlich.

    – Krim

    25. März 2009 um 15:16 Uhr

  • Wir brauchten nur die URL zur Anleitung. drawh hat dafür gesorgt. Vielen Dank!

    – Benford

    23. April 2009 um 7:21 Uhr

Da dies jetzt ein Community-Wiki ist, dachte ich, es wäre hilfreich, einige Ressourcen und Tutorials zu verlinken:

http://blog.stormyprods.com/2008/11/using-static-libraries-with-iphone-sdk.html

http://www.clintharris.net/2009/iphone-app-shared-libraries/

Genießen!

Das 320-Projekt scheint in der Tat ein guter Ausgangspunkt zu sein. Aber es fehlt (glaube ich) an:

  • die Bibliothek sofort in neuen Projekten verfügbar zu haben
  • die neuen Klassen unter ‘neue Datei’ verfügbar zu haben

Das sind Projekt- und Dateivorlagen. Für mehr Informationen, fragen Sie das Google.

Wenn Sie dies im App Store veröffentlichen möchten, können Sie Ihre Bibliothek nicht so verwenden, wie Sie es möchten. Wie oben erwähnt, wird das Verknüpfen mit Bibliotheken von Drittanbietern auf dem Telefon nicht unterstützt. Ich denke, es gibt einen “Hack”-Weg, damit es funktioniert, aber Sie werden die Verteilung verlieren.

Das Beste, was mir einfiel, war, den gesamten relevanten Code in ein Verzeichnis zu stellen und ihn auf diese Weise zu teilen. Ich weiß, es ist nicht so elegant, aber es ist ihre Einschränkung, dh. außerhalb unserer Kontrolle.

1433420cookie-checkEin Leitfaden zum Erstellen Ihrer eigenen Bibliothek für die Cocoa(touch)-Entwicklung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy