2009-06-04 8 views
13

Ho letto su RAII e costruzione/inizializzazione singola o bifase. Per qualsiasi motivo, sono stato nel campo a due fasi fino a poco tempo fa, perché a un certo punto devo aver sentito che è male fare operazioni soggette a errori nel costruttore. Tuttavia, penso di essere ora convinto che la monofase sia preferibile, in base alle domande che ho letto su SO e altri articoli.Objective C costruzione di oggetti a due fasi

La mia domanda è: perché l'Objective C usa l'approccio a due fasi (alloc/init) quasi esclusivamente per costruttori non di convenienza? C'è qualche ragione specifica nella lingua, o è stata solo una decisione progettuale dei designer?

risposta

28

Ho l'invidiabile situazione di lavoro per il tizio che ha scritto +alloc nel 1991, e mi è capitato di fargli una domanda molto simile qualche mese fa. L'aggiunta di +alloc era al fine di fornire +allocWithZone:, che era per aggiungere pool di memoria in NeXTSTEP 2.0 dove la memoria era molto stretta (4M). Ciò ha permesso al chiamante di controllare dove gli oggetti erano allocati in memoria. Era un sostituto di +new e dei suoi parenti, che era (e continua ad esserlo, anche se nessuno lo usa) un costruttore a 1 fase, basato su Smalltalk new. Quando Cocoa si avvicinò ad Apple, l'uso di +alloc era già trincerato e non era possibile tornare a +new, anche se in realtà il prelievo dello NSZone è raramente significativo.

Quindi non è una grande domanda filosofica monofase/bifase. In pratica, Cocoa ha una costruzione monofase, perché si fa sempre (e si dovrebbe sempre) chiamare questi back-to-back in una singola chiamata senza un test sullo +alloc. Puoi considerarlo un modo elaborato di digitare "nuovo".

+3

+1 Wow, non avrei potuto chiedere una risposta migliore –

3

La mia esperienza è con C++, ma uno svantaggio dell'inizializzazione di una fase di C++ è la gestione di ereditarietà/funzioni virtuali. In C++, you can't call virtual functions during construction or destruction (beh, puoi, semplicemente non farà quello che ti aspetti). Un init a due fasi potrebbe risolvere questo problema (parzialmente. Da quello che ho capito, sarebbe stato indirizzato alla classe giusta, ma l'init potrebbe non aver ancora finito. Potresti ancora fare le cose con quello) (Sono ancora a favore del una fase)

Problemi correlati