Реализация NSSet - PullRequest
       4

Реализация NSSet

13 голосов
/ 03 мая 2011

Этот вопрос просто из любопытства, но как реализован NSSet?Какая структура данных стоит за ней и каково время доступа для добавления и удаления элементов?Если бы мне пришлось угадывать, я бы сказал, что это была какая-то структура данных хеш-таблицы / словаря, но в таком случае зачем делать различия между NSSet и NSMutableSet?

Ответы [ 3 ]

19 голосов
/ 03 мая 2011

Что ж, как отметил Бавариус в комментарии, фактический источник Apple CoreFoundation открыт и доступен для вашего прочтения .NSSet реализован поверх CFSet, чей код генерируется (как и код CFDictionary) из шаблона хеш-таблицы, используя CFBasicHash для выполненияРабота.

Разница между изменчивостью и неизменяемостью, по-видимому, связана с флагом в структуре (строка 91 из CFBasicHash.h), и из моего прочтения пока что влияет только на вызовы функций, таких каккак CFBasicHashAddValue;есть простая проверка на изменчивость.Однако представляется вероятным, что Коббал прав в отношении поведения копирования / сохранения между этими двумя (я просто еще не читал это).

ПРЕДЫДУЩАЯ:
Иногда я нахожу это интересным и познавательным дляПросматривайте источники GNUstep , когда я задаюсь вопросом о деталях реализации.Они, конечно, вовсе не гарантируют, что будут реализованы так, как это сделала Apple, но в некоторых случаях они могут быть полезны.Их версия Foundation: http://gnu.ethz.ch/debian/gnustep/gnustep-base-1.20.0/Headers/Foundation/ (Надеюсь, это самая последняя версия. Если нет, пожалуйста, исправьте меня.)

2 голосов
/ 03 мая 2011

Чтобы ответить на вторую половину вашего вопроса: одно преимущество наличия неизменяемой версии состоит в том, что она позволяет очень быстро копировать метод, который просто вызывает retain.

1 голос
/ 03 мая 2011

Я считаю эту ссылку интересным ответом на ваш вопрос.Структуры данных Apple (NSArray, NSSet, NSDictionary и т. Д.) Не реализованы простым и «стандартным способом».В большинстве случаев они работают так же, как и любой другой набор, но в целом они автоматически оптимизируются для достижения наилучшей производительности.Так что, по правде говоря, это довольно сложно сказать.В то время как Apple предоставляет документацию по эффективности массивов в CFArray.h (эквивалентно NSArray с), она не предлагает такой документации по эффективности наборов, хотя вы можете просматривать /System/Library/Frameworks/CoreFoundation.framework/Headers/, чтобы просмотреть другую структуру данныхреализации.

Кроме того, должно быть различие между множеством и его изменяемым аналогом, так же как существует различие между NSString и NSMutableString, NSArray и NSMutableArray, и NSDictionary и NSMutableDictionary (среди прочих).Для структур данных и строк (и нескольких других классов) Apple предлагает «только для чтения» версии классов, чтобы сохранить общность, наряду со стандартными «изменяемыми» аналогами для манипуляции.Это просто стандартная практика Apple.

...