Какова максимальная длина ключа в NSDictionary? - PullRequest
4 голосов
/ 11 июня 2010

В настоящее время я работаю над приложением, которое отображает кучу файлов в таблице, и вы можете добавлять и удалять их и все что угодно. Чтобы избежать дублирования в таблице, я хотел бы создать NSDictionary, используя полный путь к файлам в качестве ключей для другого NSDictionary, который содержит всю информацию о файле, но меня немного беспокоит максимальная длина ключа NSDictionary, а также то, решение будет производительность убийца или нет ...

Ответы [ 4 ]

9 голосов
/ 11 июня 2010

Нет конкретных ограничений на размер используемой строки NSS, если она не так велика, что вы заполняете всю память!Словарь не загружается в символы и начинает смотреть на них сам, поэтому не будет никаких внутренних проблем NSDictionary, связанных с этим, или проблем с производительностью, поскольку все, что он делает, это использует метод isEqual:совпадения.

Надеюсь, что поможет.

3 голосов
/ 11 июня 2010

Нет конкретного ограничения. Одним из обязательных условий для словарей является то, что ключ должен соответствовать протоколу NSCopying. Когда вы вставляете пару ключ-значение в словарь, словарь создает копию ключевого объекта, чтобы гарантировать, что он не мутирует внутри словаря. Он использует значение хеш-функции ключевого объекта, чтобы определить, где его упорядочить внутри. Если объект был видоизменен, пока он находился в словаре, он отбросил бы порядок, и словарь не работал, поэтому словарь делает копию (хотя в качестве оптимизации, когда запрашиваются неизменяемые объекты, такие как NSString) копия, это может просто увеличить количество сохраняемых данных и вернуть себя, но это деталь реализации).

Поскольку ключи должны соответствовать протоколу NSCopying, это означает, что вы можете использовать несколько объектов в качестве ключей к словарю, включая NSArray, NSData и т. Д. Не беспокойтесь о производительности при использовании больших строк в NSDictionary коллекций, если вы не обнаружили, что это на самом деле узкое место.

2 голосов
/ 11 июня 2010

Максимума нет, разве что максимальная длина NSString, которая, я думаю, теоретически не ограничена / UIntMax. Интерфейс NSDictionary требует индексации с помощью методов -hash и -isEqual:, реализуемых любым объектом, используемым в качестве ключа, чтобы позволить ключам быть чем угодно, а не только NSStrings. Конечно, NSString реализует обе функции, но это не главное - хеш - это целое число, так что в основном дело до NSString - найти способ превратить его содержимое в целое число - это не обязательно (и физически ) быть уникальным, просто повторяемым (возвращая один и тот же результат каждый раз). Смотрите здесь для получения подробной информации о хешировании. По сути, это означает, что каждая строка NSString - любой объект на самом деле - может иметь хэш. Следовательно, если вы можете сохранить его в NSString, тогда нет ограничений на его размещение в NSDictionary. Кроме того, не беспокойтесь о производительности / словари словарей - это совершенно правильный дизайн, и они достаточно быстры, чтобы их можно было применять.

1 голос
/ 11 июня 2010

Теоретического максимума нет.Кроме того, я не буду беспокоиться о производительности, пока вы не решите, что это действительно проблема.

...