2010-06-15 10 views
5

C'è un modo 'semplice' di avere puri contenitori Objective-C, come NSMutableDictionary o CFMutableDictionary, che non incrementa il conteggio di riferimento di oggetti aggiunti, senza utilizzare la standard C++ biblioteca?dizionario non riferimento conteggio nell'obiettivo-c

MODIFICA: Spiegazione: la ragione per cui desidero è che io possa implementare una specie di modello "Esattamente uno": una classe avrà un metodo statico getThing: (NSString *). Se quel metodo trova una Cosa associata al nome in qualche datastructure statico (il dizionario di conteggio non di riferimento), lo restituisce, altrimenti ne crea uno, lo aggiunge alla struttura sotto quel nome e lo restituisce. Quell'oggetto Thing può essere conservato dal client a piacimento, ma quando il suo conteggio di riferimento scende a 0 (e viene chiamato dealloc), dovrebbe essere rimosso dal dizionario. Quindi, non posso rilasciarlo quando lo aggiungo e lo tengo di nuovo durante la sua rimozione - dealloc verrebbe chiamato di nuovo, e io non lo voglio. Ecco perché ho bisogno del dizionario non incrementale. Se c'è un altro modo per ottenere quello che voglio, per favore fatemelo sapere, anche se sono abbastanza sicuro che la risposta verificata mi dà quello che voglio. Grazie!

risposta

3

Se si sta sviluppando per MacOSX, quindi è possibile utilizzare NSMapTable. Vedi questo blog post from Mike Ash per saperne di più.

Se si sta sviluppando per iPhone, è possibile utilizzare CFMutableDictionary con strutture di callback personalizzato:

  • copiare le strutture kCFTypeDictionaryKeyCallBacks e kCFTypeDictionaryValueCallBacks in quelli nuovi.
  • mettere i campi retain e release NULL in cui non è necessario mantenere/release (chiave e/o valori).
  • passare le strutture quando si chiama CFDictionaryCreateMutable.

In questo modo, si avrà un dizionario che non conserva né rilascia.

1

Perché si bisogno di un contenitore di conteggio non di riferimento? Se si memorizzano valori ordinari (come numeri interi), è possibile includerli nel tipo NSValue e se si dispone di un altro tipo, ma non si desidera che contengano molti riferimenti, è sufficiente richiamare "release" immediatamente dopo averlo aggiunto a Il container.

+1

Il problema con il richiamo 'release' dopo l'aggiunta è che il contenitore rilascia l'oggetto quando viene rimosso, quindi se non si è tenuto su di esso un puntatore che è possibile conservare prima della rimozione, si finisce rilasciandolo. – warrenm

+0

@warrenm, ma è possibile chiamare esplicitamente retain prima di rimuovere l'oggetto ... ovviamente, non vedo perché non si voglia aumentare il conteggio dei riferimenti su add in primo luogo. –

+0

Buon punto. Ciò annulla totalmente il mio commento. Mi dispiace per quello – warrenm

1

Si potrebbe creare un NSValue che rappresenta ogni oggetto con il metodo valueWithPointer:. Aggiungere i valori alla raccolta invece non manterrebbe l'oggetto di riferimento. Questo è piuttosto grossolano, quindi considera se potrebbe non esserci un modo migliore per raggiungere il tuo obiettivo piuttosto che aggirare la proprietà del contenitore degli oggetti contenuti.

0

Se su Mac OS X, utilizzare NSMapTable.

Problemi correlati