Domanda

Non non ho intenzione di scrivere applicazioni senza IB, sto solo cercando di saperne di più sulla programmazione.

Come posso ottenere una singola istanza della mia classe AppController all'avvio? (Viene normalmente caricato dal pennino.) E puoi chiarire l'uso di + inizializza e -init ? Se ho capito, + initialize viene chiamato su tutte le classi all'avvio. Come posso usarlo per creare un'istanza del mio AppController con variabili di istanza che compongono la mia interfaccia?

Spero che abbia un senso e grazie per l'aiuto.

È stato utile?

Soluzione

+ initalize viene inviato a una classe la prima volta che una o una delle sue sottoclassi riceve un messaggio per la prima volta. Quindi, quando lo fai:

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

Quel messaggio allocare innesca inizializza .

Se fai la stessa cosa con una sottoclasse:

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

Quel messaggio allocare attiverà + [YourClass inizializza] allo stesso modo dell'altro (prima di attivare anche + [SubclassOfYourClass inizializza] . Ma solo uno di questi lo farà: il inizializza di ogni classe non viene mai chiamato più di una volta. [SomeClass initialize] —non farlo, perché il metodo non se lo aspetta.)

-init , invece, inizializza una nuova istanza. Nell'espressione [[YourClass alloc] init] , stai inviando personalmente il messaggio direttamente all'istanza. Puoi anche chiamarlo indirettamente, tramite un altro inizializzatore ( [[[YourClass alloc] initWithSomethingElse: bar] ) o un factory di convenienza ( [YourClass instance] ).

A differenza di inizializza , dovresti sempre inviare init (o un altro inizializzatore, se appropriato) alla tua superclasse. La maggior parte dei metodi init è simile a questa:

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

I dettagli differiscono (questo metodo o la superclasse o entrambi possono prendere argomenti, e alcune persone preferiscono self = [super init] sulla propria riga e Wil Shipley non assegna affatto a self ), ma la base l'idea è la stessa: chiama [super init [WithSomething:…]] , assicurati che non restituisca zero , imposta l'istanza se non lo fa, e restituire qualunque sia la superclasse restituita.

Ciò implica che tu puoi restituire nil da init , e infatti puoi farlo. In questo caso, dovresti [self release] , in modo da non perdere l'oggetto non riuscito. (Per rilevare valori di argomenti non validi, un'alternativa è NSParameterAssert , che genera un'eccezione se l'asserzione fallisce. I meriti relativi di ciascuno vanno oltre lo scopo di questa domanda.)

  

Come posso usarlo per creare un'istanza del mio AppController con variabili di istanza che compongono la mia interfaccia?

Il modo migliore è fare tutto in main :

int main(int argc, char **argv) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    AppController *controller = [[[AppController alloc] init] autorelease];
    [[NSApplication sharedApplication] setDelegate:controller]; //Assuming you want it as your app delegate, which is likely
    int status = NSApplicationMain(argc, argv);

    [pool drain];
    return status;
}

Eseguirai qualsiasi altra impostazione nei metodi delegati dell'applicazione in AppController .

Lo sai già, ma per chiunque legga questo: I pennini sono tuoi amici. Interface Builder è tuo amico. Non combattere il framework: lavora con esso e crea la tua interfaccia graficamente, e la tua applicazione sarà migliore per questo.

Altri suggerimenti

Una serie di NIB sembra essere una risposta insoddisfacente, anche se rappresentata in XML (come XIB), perché non esiste un modo semplice per confrontarli o unirli con qualsiasi sovversione standard o strumento in stile SCM. Le informazioni codificate sono fragili e non intendono essere modificate da semplici umani. In che modo le modifiche sarebbero rappresentate da una GUI? Esaminerei ogni attributo di ciascun controllo e li controllerei visivamente?

Se il comportamento dell'app è scritto nel codice, tuttavia, è possibile che riesca a capire cosa sta succedendo, anche se devo tenere a portata di mano molti dettagli allo stesso tempo.

Una proposta : usa un NIB di primo livello codificato dall'architetto principale, ma poi codifica esplicitamente il resto dell'app.

Qualcuno ha avuto un'idea migliore?

Un'altra soluzione al problema dell'avvio di un'app senza pennino.

Invece di allocare il proprio controller, basta usare i parametri extra nel metodo NSApplicationMain () :

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

Questo si prende cura di tutti i collegamenti appropriati di cui avremmo bisogno.

Quindi, l'unica altra cosa che dovresti ricordare è creare la tua finestra e impostarla come visibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top