2014-06-19 19 views
9

Desidero utilizzare una NSHashTable per mantenere i riferimenti deboli agli oggetti contenuti. Riguardo ad altri comportamenti personalizzabili (incluso controllo di uguaglianza), voglio lo stesso identico comportamento di NSSet (quindi praticamente voglio avere un NSSet con riferimenti deboli). Puoi darmi un esempio su come inizializzare una tabella di hash simile?NSHashTable con rifrazioni deboli

Would seguente bastano: [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]

anche i NSHashTable con riferimenti deboli rimuovere automaticamente gli oggetti de-assegnati?

Grazie.

+0

Si dovrebbe notare che NSHashTable è disponibile solo in OSX e non iOS. –

+3

@SandyChapman 'NSHashTable' è disponibile su iOS dal 6.0. Controlla l'intestazione 'NSHashTable.h'. – TylerTheCompiler

+0

@DrBeardface Interessante che [i documenti] (https://developer.apple.com/library/mac/documentation/cocoa/reference/NSHashTable_class/Introduction/Introduction.html) non dice che è supportato allora. ** MODIFICA: ** Sembra che sto guardando i documenti sbagliati. [Questo] (https://developer.apple.com/library/ios/documentation/cocoa/reference/NSHashTable_class/Introduction/Introduction.html) dice che è supportato. –

risposta

9

Sì, è possibile utilizzare NSPointerFunctionsWeakMemory. Facebook KVOController utilizzare anche NSHashTable con tale opzione, vedere KVOController

- (instancetype)init 
{ 
    self = [super init]; 
    if (nil != self) { 
    NSHashTable *infos = [NSHashTable alloc]; 
#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED 
    _infos = [infos initWithOptions:NSPointerFunctionsWeakMemory|NSPointerFunctionsObjectPointerPersonality capacity:0]; 
#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) 
    if ([NSHashTable respondsToSelector:@selector(weakObjectsHashTable)]) { 
     _infos = [infos initWithOptions:NSPointerFunctionsWeakMemory|NSPointerFunctionsObjectPointerPersonality capacity:0]; 
    } else { 
     // silence deprecated warnings 
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wdeprecated-declarations" 
     _infos = [infos initWithOptions:NSPointerFunctionsZeroingWeakMemory|NSPointerFunctionsObjectPointerPersonality capacity:0]; 
#pragma clang diagnostic pop 
    } 

#endif 
    _lock = OS_SPINLOCK_INIT; 
    } 
    return self; 
} 

Inoltre, per modo più conveniente, è possibile utilizzare weakObjectsHashTable

restituisce una nuova tabella di hash per memorizzare i riferimenti deboli al suo contenuto.

Return Value Una nuova tabella di hash che utilizza le opzioni NSHashTableZeroingWeakMemory e NSPointerFunctionsObjectPersonality ed ha una capacità iniziale di 0.

Il documento è un po 'vecchio, ma è vero. Vedere NSHipster NSHash​Table & NSMap​Table

NSHashTableZeroingWeakMemory: This option has been deprecated. Instead use the NSHashTableWeakMemory option 

Si noti inoltre che

NSHashTableWeakMemory Uguale a NSPointerFunctionsWeakMemory

Problemi correlati