Domanda

Di solito, quando dobbiamo collegare un elemento di interfaccia a un campo di una classe, usiamo la parola 'IBOutlet' per informare il pre-copiler:

@interface MyController : NSObject {
    IBOutlet NSWindow *theWindow;
}

e nell'attuazione usiamo direttamente il theWindow puntatore per chiamare i metodi della classe NSWindow!

Ma quali sono i vantaggi di dire al pre-compilatore per creare alcune funzioni di accesso per l'oggetto che viene puntato da "theWindow" e gestire l'oggetto attraverso le funzioni di accesso?

Esempio:

@interface MyController : NSObject {
   NSWindow *theWindow;
}
@property(retain) IBOutlet NSWindow *theWindow;


@implementation MyController

@synthesize theWindow;

@end

Fa l'uso della seconda soluzione (per tutti i puntatori agli elementi dell'interfaccia) rallenta le prestazioni dell'applicazione?

Quando si tratta di una buona pratica di utilizzare il secondo modo invece che il primo?

Grazie!

È stato utile?

Soluzione

Bene, in generale, non mantenere le proprietà, e l'unico modo che io abbia mai espongo anche Outlets è se qualcosa deve accedere a un elemento da fuori, e questo è generalmente un brutto segno per il vostro disegno in ogni caso.

Non ho provato ma mi sarei tentato di sintesi solo la parte di lettura, e probabilmente userei solo nei posti in cui in cui l'accesso importante atomica. Alcune porzioni di AppKit non sono sempre threadsafe.

Altri suggerimenti

Bryan è corretta in quanto è sufficiente per esporre le proprietà degli elementi di interfaccia utente se è necessario l'accesso ad essi da un'altra istanza o di un'altra classe del tutto. E ' è di solito un segno di un problema di progettazione architettonica, ma non sempre.

Per rispondere alle ultime due domande:

  

Fa l'uso della seconda soluzione (per tutti i puntatori agli elementi dell'interfaccia) rallenta le prestazioni dell'applicazione?

No. Non più di aggiungere un metodo chiamato -doSomethingReallyComplicated rallenta la domanda se tale metodo non viene mai chiamato. Si può rallentare il lancio con un mucchio di codice non utilizzato (rendendo così il binario più grande per nessun motivo) e certamente rallenta tempo di compilazione, ma non sarà un impatto sulle prestazioni di esecuzione dell'applicazione.

  

Quando si tratta di una buona pratica di utilizzare il secondo modo invece che il primo?

Come ha detto Bryan, si espone un elemento dell'interfaccia utente come una proprietà (tramite @synthesize o una funzione di accesso codificato a mano) quando è necessario accedervi da fuori di una determinata istanza di quella classe. Anche in questo caso, la necessità di fare questo è di solito un segno di un problema di progettazione.

Il tempo una funzione di accesso prende completamente impercettibile. Anche se è stato eseguito questo codice milioni di volte, tutti i macchinari IB sarebbe positivamente impallidire esso.

Se queste variabili sono impostate solo in quel momento e non accessibili al di fuori della classe, di accesso potrebbero essere inutili.

Quando un pennino è essere disarchiviato, se esiste una funzione di accesso per impostare una data presa, allora l'Unarchiver userà. Se non c'è di accesso, allora l'ivar verrà impostata direttamente utilizzando le funzioni di runtime Obj-C per trovarlo per nome.

La funzione di accesso sarà più veloce, dal momento che eviterete tutto il slogging attraverso il runtime per trovare l'Ivar in questione. Detto questo, a meno che non si sta andando ad essere carica che pennino più e più volte, la differenza sarà trascurabile.

Il motivo principale per cui si vorrebbe una funzione di accesso per una presa di corrente è lo stesso per qualsiasi altra ivar o proprietà che si desidera pubblicare. E 'un modo pratico per fare in modo che la gestione della memoria è coperto correttamente.

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