Различия NSMapTable и NSMutableDictionary

Является ли NSMapTable тем же, что и NSMutableDictionary кроме того, чтобы позволить ключам быть указателями?

Отличается ли управление памятью?

12 голосов | спросил 123hal321 2 AM00000010000000031 2011, 01:13:00

4 ответа


0

Основное различие между NSMapTable и NSMutableDictionary заключается в том, что NSMapTable хранит слабые указатели. Это означает, что когда вы вызываете что-то вроде этого:

[my_table setValue: val forKey: key];

значение и ключ не сохраняются (это означает, что сообщение об их сохранении не отправляется). Вот почему вы можете использовать любой объект (или, возможно, не объект, а любой указатель), потому что они не должны отвечать на сохранение сообщения.

Таким образом, вы, вероятно, захотите использовать NSMapTable, если вы используете сборщик мусора, когда вам не нужно беспокоиться о сохранении количества объектов.

ответил Max 2 AM00000010000000631 2011, 01:43:06
0

NSMapTable более гибок, чем NSDictionary. В то время как NSDictionary сохраняет строгие ссылки для значений и копий ключей, вы можете настроить NSMapTable так, чтобы любое из этих поведений независимо для объектов и значений: сильное, слабое или копирование (существует больше вариантов поведения).


Практический пример использования: NSDictionary сохраняет строгую ссылку (сохраняет) указателя значения, но копирует ключ. Это означает, что a) экземпляр ключа должен реализовать протокол NSCopying и b) в зависимости от сложности класса копирование может добавить дополнительную нагрузку. С другой стороны, вы можете настроить NSMapTable так, чтобы он действовал как NSDictionary, который использует строгие ссылки как для значений , так и ключей, протокол копирования или NSCopying не требуется.

  

Поведение объекта между объектами ранее можно было эмулировать, используя   NSDictionary, если все ключи были номерами NSN, содержащими память   адрес исходного объекта в отображении (не смейтесь, я видел это   готово) но за пределами этого бега NSMapTable предлагает истинный   отображение объект-объект впервые в коллекции Какао   класс.

     

(Из отличной статьи, посвященной NSMapTable, когда она была представлена ​​.)

Давайте посмотрим на API. Это вернет объект, который работает так же, как NSMutableDictionary:

[NSMapTable mapTableWithKeyOptions:NSMapTableCopyIn
                      valueOptions:NSMapTableStrongMemory]

Это вернет работающий объект без копирования ключей:

[NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory
                      valueOptions:NSMapTableStrongMemory]

Примечание. Похоже, что API-интерфейс NSMapTable изменился в последних SDK, но этот синтаксис совместим со всеми SDK.

NSMapTable доступен в OS X 10.5+ и iOS 6.0 +.

ответил Steph Thirion 30 AM000000120000005531 2012, 00:52:55
0

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

Другое отличие состоит в том, что NSMapTable может дополнительно использовать равенство указателей для хэширования.

ответил omz 2 AM00000010000004531 2011, 01:42:45
0

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

Также в 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
ответил Avt 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 16 Sep 2014 15:51:03 +0400 2014, 15:51:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132