Kakao ohne Interface Builder, initialisieren Sie eine Instanz von app controller?
Ich nicht plan, um Anwendungen zu schreiben, ohne IB, ich bin nur in den Prozess der versucht zu lernen, mehr über die Programmierung.
Wie kann ich eine einzelne Instanz von meinem AppController-Klasse am Start? (Es ist normalerweise geladen, aus der Feder.) Und können Sie deaktivieren die Verwendung von +initialize
und -init
? Wenn ich verstehe, +initialize
heißt auf alle Klassen am Start. Wie kann ich diese erstellen eine Instanz des AppController mit Instanz-Variablen, der mein interface?
Hoffe das macht Sinn, und vielen Dank für jede Hilfe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
+initalize
gesendet wird, um eine Klasse zum ersten mal Sie oder einer Ihrer Unterklassen erhält eine Nachricht für die erste Zeit. Also, wenn Sie tun:Dass
alloc
Nachricht löstinitialize
.Wenn Sie das gleiche tun mit einem Unterklasse:
Dass
alloc
Nachricht auslösen wird+[YourClass initialize]
auf die gleiche Weise die anderen eine Tat (vor der auch das auslösen+[SubclassOfYourClass initialize]
. Aber nur einer von diesen wird es tun—jede Klasseinitialize
wird nie mehr als einmal aufgerufen. (Es sei denn, Sie nennen es selbst mit[super initialize]
oder[SomeClass initialize]
—so tun Sie das nicht, weil die Methode nicht erwarten.)-init
, auf der anderen Seite, initialisiert eine neue Instanz. In dem Ausdruck[[YourClass alloc] init]
Sie sind persönlich dem senden der Nachricht direkt an die Instanz. Sie können auch nennen es indirekt, durch eine andere Initialisierung ([[YourClass alloc] initWithSomethingElse:bar]
) oder einem convenience-Fabrik ([YourClass instance]
).Im Gegensatz zu
initialize
sollten Sie immer sendeninit
(oder eine andere Initialisierung, wenn geeignet) mit Ihrer Oberklasse. Die meisten init-Methoden in etwa so Aussehen:Details unterscheiden sich (diese Methode oder die Oberklasse ist oder beide Argumente, und einige Leute bevorzugen
self = [super init]
auf seine eigene Linie, und Wil Shipley nicht zuordnenself
an alle), aber die Grundidee ist die gleiche: rufen Sie[super init[WithSomething:…]]
sicher, dass es nicht zurücknil
eingerichtet, die Instanz wenn es nicht, und zurück, was der Superklasse zurückgegeben.Dies impliziert, dass Sie zurückkehren können
nil
ausinit
, und in der Tat Sie können. Wenn Sie dies tun, sollten Sie[self release]
, so dass Sie nicht Leck die ausgefallene Objekt. (Für die Erkennung von ungültigen Argumentwerten, eine alternative istNSParameterAssert
, die wirft eine Ausnahme, falls die assertion fehlschlägt. Die relativen Vorzüge der einzelnen würde den Rahmen dieser Frage.)Ist der beste Weg, es zu tun alles in
main
:Werden Sie tun, alle anderen set-up in Ihrer Anwendung Delegierten Methoden in
AppController
.Du schon wissen, aber für jemand anderes, der dies liest: Federn sind dein Freund. Interface Builder ist dein Freund. Kämpfen Sie nicht gegen die Rahmen—arbeiten mit es, und bauen Sie Ihre Schnittstelle grafisch, und Ihre Anwendung wird für Sie besser.
Einen Satz Federn zu sein scheinen, eine unbefriedigende Antwort, auch wenn in XML dargestellt (eine XIB), denn es gibt keine einfache Weise zu vergleichen oder mischen Sie Sie mit jedem standard-subversion-oder SCM-style-tool. Die codierte information ist zerbrechlich und nicht bearbeitet werden sollen, durch bloße Menschen. Wie würden änderungen dargestellt werden, die durch eine GUI? Würde ich Schritt für Schritt durch jedes Attribut jeder Kontrolle und visuell prüfen Sie?
Wenn die app das Verhalten im code geschrieben, jedoch gibt es eine chance, dass ich herausfinden kann, was Los ist, auch wenn ich halten Sie viele details in der Nähe bei der hand zur gleichen Zeit.
Einen vorgeschlagen Lösung: verwenden Sie eine top-level-Feder, die die wichtigsten Architekten codiert, aber dann code, der rest von der app ausdrücklich zu.
Jemand ne bessere Idee?
Andere Lösung für das problem von starten einer app, ohne eine Feder.
Statt allocing Ihren eigenen controller, nutzen Sie einfach die zusätzlichen Parameter, die in der
NSApplicationMain()
Methode:Diese kümmert sich um alle die richtige Verknüpfung eines brauchen würde.
Dann, die einzige andere Sache, die Sie brauchen zu erinnern ist, um Ihre eigenen Fenster und legen Sie es auf sichtbar.