2014-06-19 2 views
9

Я хочу использовать NSHashTable для хранения слабых ссылок на содержащиеся объекты. Что касается других настраиваемых поведений (включая проверку равенства), я хочу точно такое же поведение, как NSSet (так что практически я хочу иметь NSSet со слабыми ссылками). Можете ли вы привести пример того, как инициализировать такую ​​хеш-таблицу?NSHashTable со слабыми рефрексами

Would следующих хватаи: [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]

Также будет NSHashTable с слабыми ссылками автоматически удаляют де-распределенные объекты?

Спасибо.

+0

Следует отметить, что NSHashTable доступен только в OSX и не прошивкой. –

+3

@SandyChapman 'NSHashTable' был доступен на iOS с 6,0. Проверьте заголовок 'NSHashTable.h'. – TylerTheCompiler

+0

@DrBeardface Интересно, что [docs] (https://developer.apple.com/library/mac/documentation/cocoa/reference/NSHashTable_class/Introduction/Introduction.html) не говорит, что его поддерживает. ** EDIT: ** Похоже, я смотрю на неправильные документы. [Этот] (https://developer.apple.com/library/ios/documentation/cocoa/reference/NSHashTable_class/Introduction/Introduction.html) говорит, что он поддерживается. –

ответ

9

Да, вы можете использовать NSPointerFunctionsWeakMemory. Facebook KVOController также использовать NSHashTable с этой опцией, см 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; 
} 

Кроме того, для более удобного пути, вы можете использовать weakObjectsHashTable

Возвращает новый хэш-таблицу для хранения слабых ссылок на его содержание.

Возвращаемое значение новый хэш-таблицу, которая использует параметры NSHashTableZeroingWeakMemory и NSPointerFunctionsObjectPersonality и имеет начальную емкость 0.

Документ немного старый, но это правда. См NSHipster NSHash​Table & NSMap​Table

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

Отметим также, что

NSHashTableWeakMemory Равно NSPointerFunctionsWeakMemory

Смежные вопросы