2012-02-14 7 views
8

Sono confuso guardando la documentazione di Apple e leggendo attraverso i modelli di design Cocoa. Nella documentazione Apple per copyWithZone:, si legge:Ignora copia o copiaWithZone: o entrambi?

Questo metodo esiste perché gli oggetti di classe può essere utilizzato in situazioni in cui hai bisogno di un oggetto che è conforme al protocollo NSCopying. Per esempio , questo metodo consente di utilizzare un oggetto di classe come chiave per un oggetto NSDictionary . Non dovresti ignorare questo metodo.

Per copy si legge:

Questo è un metodo comodo per le classi che adottano il protocollo NSCopying . Viene sollevata un'eccezione se non esiste un'implementazione per copyWithZone :.

NSObject non supporta il protocollo NSCopying. Sottoclassi devono supportare il protocollo e implementare il metodo copyWithZone :. A versione sottoclasse di copyWithZone: il metodo deve inviare prima il messaggio , per incorporarne l'implementazione, a meno che la sottoclasse discenda direttamente da NSObject.

Negli esempi di modelli di progettazione di cacao, hanno la precedenza su copyWithZone: e mutableCopyWithZone: ma non prevalgono copy quando conforme al protocollo NSCopying. È quello che dovrei fare se voglio usare la mia sottoclasse personalizzata in un NSDictionary come chiave?

Oppure si esegue l'override di copy?

Analogamente, se faccio [myClass copy], si chiama copyWithZone: o copy per quella sottoclasse personalizzata? Grazie.

risposta

14

È piuttosto semplice: l'implementazione predefinita di copy chiama solo copyWithZone: con un argomento NULL. Quindi è necessario implementare sempre copyWithZone:. Tuttavia, poiché le zone di memoria non vengono utilizzate (per quanto ne so) su iOS, è necessario ignorare la zona senza fare alcuna ipotesi.

Edit: elaborare, si può implementare copy pure, ma si deve implementare copyWithZone: perché non si sa mai quale di loro NSDictionary chiamerà in iOS 6.

0

È possibile continuare a utilizzare la comodità superclasse metodo così com'è, perché non fa altro che chiamare copyWithZone: in ogni caso.

Questo dovrebbe essere vero per qualsiasi metodo di convenienza. Dovresti scoprire quale metodo chiamano e sovrascrivere quello.

Come detto sopra, le zone non vengono più utilizzate, ma il metodo ha ancora quel parametro per ragioni di compatibilità e storiche.