Почему общие классы коллекций в Objective C, такие как NSString, NSArray, NSDictionary и т. Д., Имеют как изменяемую, так и неизменную версию.
эта концепция используется в родственных языках. заметное различие заключается в том, что типы объектов называются изменяемыми вариантами. Подобные языки обычно достигают этого с помощью ключевого слова, такого как const
. конечно, другие родственные языки также используют типы, которые являются явно изменяемыми или неизменяемыми.
Какова логика определения их отдельно?
В сообщениях objc не различаются const и non-const, а язык не предоставляет встроенной поддержки для гарантии того, что состояние объекта не изменится (хотя это действительно не будет сложным дополнением, если вы действительно склонны расширять компилятор) , так что здесь тоже немного истории.
поэтому для класса принято определять неизменяемость и изменчивость и предоставлять варианты, которые различают изменчивость.
множественные абстракции также вводят безопасность типов и намерение.
Производительность
да. Есть несколько оптимизаций, которые может выполнить инвариантный объект.
в некоторых случаях:
- он может кэшировать значения, никогда не вычисляя их более одного раза.
- он мог бы использовать точные, неизменяемые выделения для своих данных.
- он часто не требует специального кода для многопоточного использования - многие неизменяемые типы будут видоизменяться только во время строительства / разрушения.
- эти типы часто используют кластеры классов. если реализован кластер классов, то специализированные реализации могут обеспечить существенные различия в памяти, реализации и т. д., учитывая, как неизменная строка с ровно одним символом может отличаться от изменяемого варианта.
управление памятью
в некоторых случаях:
- неизменяемые типы могут делиться своим неизменным содержимым.
- они также могут сократить ассигнования. например, реализация
copyWithZone:
или initWithType:
может вернуть сохраненный источник, а не глубокую или поверхностную физическую копию.
или что-нибудь еще?
это облегчает написание понятных интерфейсов. Вы можете гарантировать и (пытаться) ограничивать некоторые вещи. если бы все было изменчиво, было бы еще много ошибок и особых случаев. фактически это различие может полностью изменить подход к написанию библиотек objc:
[[textField stringValue] appendString:@" Hz"];
[textField stateDidChange];
так что приятно иметь возможность передавать объекты, не беспокоясь о том, что клиент будет меняться за вашей спиной, избегая при этом копирования повсюду.