Когда использовать NSMutableDictionary вместо NSMapTable?

NSMapTable кажется гораздо более мощным и гибким родственником NSMutableDictionary. Его можно настроить для работы в NSMutableDictionary (для копирования ключей и сохранения строгой ссылки на значение). В каких случаях мне не следует использовать NSMapTable?


person Boon    schedule 07.05.2014    source источник
comment
В основном, есть гораздо больше способов выстрелить себе в ногу с NSMapTable, и это ненужная сложность для 99,9% применений.   -  person Hot Licks    schedule 07.05.2014
comment
Кроме того, не ясно, совместим ли NSMapTable с NSMutableDictionary, поэтому вы, вероятно, не сможете использовать его во многих случаях и будете постоянно переключаться туда и обратно.   -  person Hot Licks    schedule 07.05.2014
comment
У Мэтта Томпсона (из NSHipster) есть хорошая статья об этом здесь   -  person Alladinian    schedule 08.05.2014
comment
@HotLicks Как выстрелить себе в ногу с помощью NSMapTable?   -  person Boon    schedule 09.05.2014


Ответы (2)


Я предпочту NSDictionaryNSSet) в 99% случаев. Большая абстракция означает только большую сложность и больше способов совершить ошибку.

Я бы использовал NSMapTableNSHashTable) только в одном случае - для хранения слабых ссылок. Я не вижу для них другого полезного применения.

person Sulthan    schedule 07.05.2014
comment
@Бун Обычный CFDictionary. Цитата из NSMapTable docs: ...обычно рекомендуется использовать API функций C для указателей void *... Или я просто оберну его в NSValue. - person Sulthan; 07.05.2014

Имейте в виду, что NSMapTable иногда не освобождает ключи и объекты, если используются слабые-слабые, слабые-сильные или сильные-слабые привязки http://cocoamine.net/blog/2013/12/13/nsmaptable-and-обнуление-слабых-ссылок/.

Также в NSMapTable.h вы можете обнаружить, что 'записи не обязательно удаляются сразу после восстановления слабого ключа':

+ (id)weakToStrongObjectsMapTable NS_AVAILABLE(10_8, 6_0); 
// entries are not necessarily purged right away when the weak key is reclaimed
+ (id)weakToWeakObjectsMapTable NS_AVAILABLE(10_8, 6_0); 
// entries are not necessarily purged right away when the weak key or object is reclaimed
person Avt    schedule 16.09.2014