Frage

I nicht Plan-Anwendungen ohne IB zu schreiben, ich bin gerade dabei, zu versuchen, mehr über das Programmieren zu lernen.

Wie kann ich eine einzelne Instanz meiner AppController Klasse beim Start zu bekommen? (Es ist normalerweise von der Spitze geladen.) Und können Sie die Verwendung von +initialize und -init aufklären? Wenn ich verstehe, ist +initialize auf allen Klassen beim Start aufgerufen. Wie kann ich diese eine Instanz meiner AppController mit Instanzvariablen erstellen, die meine Schnittstelle bilden?

Hope, der Sinn und Dank für jede Hilfe macht.

War es hilfreich?

Lösung

+initalize ist das erste Mal, sie oder einer ihrer Unterklassen zu einer Klasse eine Botschaft zum ersten Mal empfängt. Also, wenn Sie das tun:

instance = [[[YourClass alloc] init] autorelease];

Die alloc Nachricht löst initialize.

Wenn Sie das gleiche tun mit einer Unterklasse:

instance = [[[SubclassOfYourClass alloc] init] autorelease];

Die alloc Nachricht wird auf die gleiche Weise auslösen +[YourClass initialize] der andere tat (vor auch Auslösung +[SubclassOfYourClass initialize]. Aber nur einer von ihnen wird es tun: Jede initialize Klasse nie mehr als einmal aufgerufen wird. (Es sei denn, Sie es selbst mit [super initialize] nennen oder [SomeClass initialize]-so tut das nicht, weil die Methode nicht erwartet werden.)

-init, auf der anderen Seite initialisiert eine neue Instanz. In dem Ausdruck [[YourClass alloc] init], senden Sie persönlich die Nachricht direkt an die Instanz. Sie können es auch indirekt nennen, durch eine andere initializer ([[YourClass alloc] initWithSomethingElse:bar]) oder eine Bequemlichkeit Fabrik ([YourClass instance]).

Im Gegensatz zu initialize, sollen Sie immer init (oder einen anderen initializer falls), um Ihre übergeordnete Klasse senden. Die meisten init Methoden aussehen grob wie folgt aus:

- (id) init {
    if ((self = [super init])) {
        framistan = [[Framistan alloc] init];
    }
    return self;
}

Details unterscheiden (diese Methode oder die Superklasse oder beiden Argumente annehmen kann, und einige Leute auf seiner eigenen Linie bevorzugen self = [super init] und

Andere Tipps

Eine Reihe von NIBs scheint eine unbefriedigende Antwort zu sein, auch wenn (als XIB) in XML dargestellt, weil es keine einfache Möglichkeit, sie zu vergleichen oder fusioniert mit jedem Standard-Subversion oder SCM-Stil-Tool. Die codierte Information ist zerbrechlich und nicht durch bloße Menschen bearbeitet sollen. Wie würden Änderungen durch eine GUI dargestellt werden? Würde ich durch jedes Attribut jeder Steuer Schritt und visuell überprüfen Sie sie?

Wenn das Verhalten der App wird in Code geschrieben, jedoch gibt es eine Chance, dass ich herausfinden kann, was in sich geht, auch wenn ich viele Details halten in der Nähe zur Hand zugleich.

vorgeschlagen Lösung:. Verwenden, um eine Top-Level-NIB, dass der Hauptarchitekt codiert, aber dann Code, um den Rest der app explizit

Hat jemand eine bessere Idee?

Eine andere Lösung für das Problem ohne eine Feder eine App von starten.

Statt ein eigenen Controller von allocing, nur die zusätzlichen Parameter in der NSApplicationMain() Methode verwenden:

int retVal = NSApplicationMain(argc, argv, @"UIApplication", @"MyAppDelegate");

Diese kümmert sich um alle die richtige Verknüpfung würde man benötigen.

Dann wird die einzige andere Sache, die Sie brauchen würden zu erinnern ist, Ihre eigenen Fenster zu machen und es zu sichtbaren gesetzt.

scroll top