Реализация 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.