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 MyPointMake
also 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.)
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.
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.