Реализация NSSet
Этот вопрос просто из любопытства, но как NSSet реализован? Какая структура данных стоит за ней и каковы времена доступа для добавления и удаления элементов? Если бы я должен был догадаться, я бы сказал, что это какая-то структура хеш-таблицы/словаря, но в этом случае зачем различать NSSet и NSMutableSet?
Ответы
Ответ 1
Хорошо, как отметил Баварий в комментарии, фактический источник CoreFoundation от Apple - открыт и доступен для вашего прочтения. NSSet
реализуется поверх CFSet
, код которого генерируется (как и у CFDictionary
) из шаблона таблицы хэшей, используя CFBasicHash
, чтобы выполнить эту работу.
Разница между mutablility и неизменяемостью, по-видимому, связана с флагом в структуре (строка 91 CFBasicHash.h
), и из моего прочтения пока что просто влияет на вызовы функций, таких как CFBasicHashAddValue
; там есть простая проверка на изменчивость. Однако представляется вероятным, что Коббаль прав относительно поведения копирования/сохранения между этими двумя (я просто еще не читал это еще далеко).
РАНЕЕ:
Мне интересно и интересно познакомиться с источниками GNUstep, когда мне интересно узнать подробности реализации. Конечно, они, конечно же, не гарантированы, что они реализованы так, как это сделала Apple, но в некоторых случаях они могут быть полезны. Их версия Foundation: http://gnu.ethz.ch/debian/gnustep/gnustep-base-1.20.0/Headers/Foundation/ (надеюсь, что самая последняя версия. Если нет, кто-то, пожалуйста, исправьте меня.)
Ответ 2
Чтобы ответить на вторую половину вашего вопроса: одно преимущество наличия непеременной версии заключается в том, что она позволяет очень быстрый метод копирования, который просто вызывает сохранение.
Ответ 3
Я нахожу эту ссылку, чтобы быть интересным ответом на ваш вопрос. Структуры данных Apple (NSArray
, NSSet
, NSDictionary
и т.д.) Не реализованы простым и "стандартным образом". В большинстве случаев они выполняются так же, как и любой другой набор, но в целом они автоматически оптимизируются для лучшей производительности. Так что, по правде говоря, это довольно сложно сказать. Хотя Apple предоставляет документацию по эффективности массивов в CFArray.h
(эквивалентно для NSArray
s), она не предлагает такой документации об эффективности наборов, хотя вы можете совать вокруг /System/Library/Frameworks/CoreFoundation.framework/Headers/
, чтобы просмотреть другую структуру данных реализации.
Кроме того, должно быть различие между множеством и его изменчивой копией, так же как существует различие между NSString
и NSMutableString
, NSArray
и NSMutableArray
и NSDictionary
и NSMutableDictionary
(среди прочих). Для структур данных и строк (и нескольких других классов) Apple предлагает "только для чтения" версии классов, чтобы сохранить общность, а также стандартные "изменчивые" аналоги для манипуляций. Это просто стандартная практика Apple.