Dipende dalle vostre preferenze.
Preferisco scriverlo in codice.
- È possibile riutilizzare il codice.
- L'utilizzo di un XIB/NIB interrompe generalmente la regola di una definizione (se si sta eseguendo qualsiasi personalizzazione).
- La manutenzione XIB/NIB è spesso più noiosa e soggetta a errori (ODR). Non mi piace davvero mantenere gli stili dei pulsanti (esempio) per ciascun pulsante.
- riferimenti circolari sono più probabili.
- Le istanze di codice/oggetti/ib sono spesso meno riutilizzabili/modulari. Anche se io sono il tipo per evitare un oggetto ui che può fare tutto.
- L'ordine di inizializzazione differito/ambiguo crea uno stato piuttosto spaventoso per i client, che non devono mai presupporre che un oggetto sia pronto per l'uso o interamente inizializzato (a meno che non si preferisca mantenere tali controlli, che è un buon modo per perdere tempo).
- Se le prestazioni sono importanti, indovina quale è più veloce?
- Gestione risorse vs linker ... seriamente, ho scritto sottoprogrammi e test per verificare l'esistenza dei pennini nel bundle.
IB è grande per la capacità di prototipazione e di oggetti di navigazione e le apparenze (io non sono un graphic designer), anche se ho penso che sia più facile basta scrivere nel codice una volta che il prototipo esiste se avete intenzione di mantenendolo o riusandolo.
La mia raccomandazione: scrivere librerie di codice altamente riutilizzabili e stabili, e utilizzare IB principalmente per prototipazione e one-off.
Risposte:
Sbrocket: Sono curioso di sapere perché si affermi che i riferimenti circolari sono più probabilità di verificarsi a seguito di utilizzo di ONA.
Ciao Sbrocket: Inizierò dicendo che ho utilizzato Interface Builder dai giorni del Project Builder (il predecessore di Xcode).
Mancanza di proprietà strutturata affidabile, identità e inizializzazione. Io non voglio ivars essere connessioni IB perché rende molte classi difficili da usare oltre 'il contesto corrente', In altre parole, lega il codice alla risorsa (più spesso che idealmente). Poiché non è possibile definire l'ordine di inizializzazione o definire gli inizializzatori o gli argomenti di inizializzazione aggiuntivi in IB, è necessario quindi rendere gli oggetti a conoscenza reciproca, creando dipendenze e riferimenti circolari.
Sbrocket: o perché l'inizializzazione differita (ipotizzando che è in realtà quello che ti riferisci a) è così spaventoso quando la sua relativamente facile (o di fatto automatica in molti casi) per garantire che l'oggetto viene inizializzato e connesso.
Re: spaventoso Non stavo parlando di inizializzazione pigro. Stavo parlando di un ordine di inizializzazione differito e ambiguo.
L'inizializzazione del pennino è semi-ordinata. L'ordine/processo effettivo può variare, e questo non può essere usato in modo affidabile all'interno di programmi introspettivi riutilizzabili ... di nuovo, si finisce per scrivere troppi codici che sono fragili, impossibili da riutilizzare, non si può mai garantire un comportamento prevedibile e devono convalidare sempre lo stato (ancora un'altra voce per la dipendenza circolare). Se non si tratta di un'implementazione una tantum, perché preoccuparsi delle complicazioni?
Questo approccio alla programmazione è caotico e le implementazioni devono (a turno) essere preparate a gestire qualsiasi cosa in qualsiasi momento. Una cosa è proteggersi dagli incidenti, ma scrivere un codice di livello di produzione difensivo in questo contesto ... in nessun modo.
È molto più facile scrivere un programma coerente che l'inizializzazione determina la validità nel contesto, che le implementazioni possono quindi sapere (se inizializzato) che l'oggetto è generalmente pronto per essere utilizzato. La complessità del caso speciale è ridotta al minimo. Molti di questi progetti si disgregano a mano a mano che la complessità del programma aumenta, mentre gli scrittori di biblioteche aggiungono strati su strati di "misure protettive" solo per mantenere in movimento gli ingranaggi - il threading è un ottimo input per tali heisenbug. Le ambiguità non necessarie non sono gradite nel codice di livello di produzione riutilizzabile; gli esseri umani non dovrebbero avere riferimenti incrociati a tutti i casi speciali di un programma, e le complessità relative al comportamento definito e ai casi speciali si diffondono o vengono ignorati (presumendo che siano tracciati e documentati in modo corretto, che è uno sforzo combinato piuttosto che scriverlo correttamente dall'inizio). Penso che tutti possiamo essere d'accordo sul fatto che dovrebbero essere evitate interfacce e implementazioni onerose.
Sbrocket: Mi piacerebbe anche essere interessati a vedere alcuni numeri duri che mostrano che NIB caricamento è più lento - naturalmente, sembrerebbe dare un senso al primo pensiero, ma siamo sempre tali cattive predittori di performance colli di bottiglia senza qualche duro test.
Non ho mai detto (esplicitamente) che era più lento :)
Ok, serietà, NIB estrazione dall'archivio è stato (per me) un processo sorprendentemente lento, anche se le nostre idee su tempi lenti e disarchiviazione può variare notevolmente .
Esempio: avevo un'app basata su documenti e il caricamento del pennino era più lento del caricamento del documento, quando le dimensioni del documento erano diverse volte la dimensione del pennino. Spostare l'implementazione sul codice ha reso il processo molto più veloce. Una volta che si trovava sul codice e avevo il controllo dell'ordine di inizializzazione, ho rimosso più complessità del multithreading (checkpoint, blocchi, voci della race condition, ecc.), Il che ha reso il caricamento del documento ancora più veloce.
Ora che hai una risposta esplicita, ti ricorderò che hai tutti gli strumenti necessari per misurare le prestazioni.
Ricordare che l'analisi e i miglioramenti delle prestazioni sono appresi.
Hai una domanda valida. Gestire le interfacce in IB è un paradigma diverso che richiede nuove competenze e familiarità. Tuttavia, rendersi conto che costruire interfacce a mano senza IB è un'abilità ancora più rara, e trovare persone disposte o in grado di gestire tale codice è una responsabilità a sé stante. Vorrei ipotizzare che i grandi progetti siano in realtà più facili da mantenere in IB, ma è ancora un compromesso: le interazioni non sono sempre immediatamente visibili in IB, ma quando lo si fa in codice, aggiunge un sacco di codice di colla extra e rimuove l'abilità per il sistema operativo e il runtime per ottimizzare le cose per te. –