Я немного пристрастился к использованию неизменяемых коллекций (в основном в Clojure, который называет их «постоянными структурами данных»), и мне бы хотелось иметь возможность программировать таким образом в некоторых контекстах на iOS и OS X.
Ключевым примером того, где это было бы полезно, является возможность «изменить» словарь, создав измененную копию, и заставить слушателей изменений запрашивать разницу между старыми и новыми значениями, а не пытаться кодифицировать изменение как событие изменения свойства. Неизменяемые структуры данных также меняют правила игры для параллельного программирования: нет необходимости в блокировках.
Да, вы можете сделать это сейчас, используя неизменяемые экземпляры NSArray
и NSDictionary
, но становится все более неэффективным копировать их для создания «измененных» версий, поскольку у вас все больше и больше коллекций и/или вы часто вносите изменения: небольшое изменение в большие данные тогда структура требует непропорционально большого объема работы.
Я ищу способ включить программирование неизменяемых данных в Objective-C. Чтобы прояснить, как это может выглядеть, и узнать о некоторых преимуществах, которые оно предлагает, исследование Фила Бэгвелла, на которое ссылается этот вопрос SO очень актуален.
NSArray
частично использует эти концепции под капотом, но ничто не гарантируется. - person eonil   schedule 08.09.2013mutableArrayValueForKey:
,mutableSetValueForKey:
и подобные методы? Я не совсем уверен, что это то, что вы ищете, но они предоставляют необходимую вам функциональность (по крайней мере, для массивов и наборов). - person Ian   schedule 07.10.2013copy
, но уверен, что это не так уж неэффективно. - person Ian   schedule 09.10.2013copy
, вероятно, довольно эффективен, но мне нужно использоватьmutableCopy
, который, вероятно, действительно копирует все данные. - person Matthew Phillips   schedule 15.10.2013mutableCopy
не создает изменяемые копии вложенных массивов и словарей, поэтому мне нуженCFPropertyListCreateDeepCopy
. Смотрите также мои комментарии к ответу tjklemz ниже. - person Matthew Phillips   schedule 22.10.2013