Функции копии
В целом стандартная работа копии, которую можно было бы также вызвать простым присвоением, происходит, когда Вы используете =
оператор для присвоения значения одной переменной другому. Выражение myInt2 = myInt1
, например, вызывает целочисленное содержание myInt1
быть скопированным с памяти, используемой myInt1
в память, используемую myInt2
. После работы копии две отдельных области памяти содержат то же значение. Однако, при попытке скопировать Базовый объект Основы таким образом, знать, что Вы не копируете сам объект, только ссылка на объект.
Например, кто-то плохо знакомый с Базовой Основой мог бы думать, что, чтобы заставить копию CFString возразить она использовала бы выражение myCFString2 = myCFString1
. Снова, это выражение фактически не копирует строковые данные. Поскольку оба myCFString1
и myCFString2
должен сделать, чтобы CFStringRef ввел, это выражение только копирует ссылку на объект. После работы копии у Вас есть две копии ссылки на CFString. Этот тип копии очень быстр, потому что только ссылка дублирована, но важно помнить, что копирование непостоянного объекта таким образом опасно. Как с программами, использующими глобальные переменные, если одна часть Ваших изменений приложений объект с помощью копии ссылки, нет никакого пути к другим частям программы, имеющим копии той ссылки, чтобы знать, что изменились данные.
Если Вы хотите копировать объект, необходимо использовать одну из функций, предоставленных Базовой Основой в частности с этой целью. Продолжая пример CFString, Вы использовали бы CFStringCreateCopy
создать полностью новый объект CFString, содержащий те же данные как оригинал. Базовые типы Основы, имеющие функции «CreateCopy» также, обеспечивают различный «CreateMutableCopy», возвращающий копию объекта, который может быть изменен.
Мелкая копия
Копирование составных объектов, объекты, такие как объекты коллекции, которые могут содержать другие объекты, должно также быть сделано с осторожностью. Поскольку Вы ожидали бы, с помощью =
оператор для выполнения копии на этих объектах приводит к дублированию ссылки на объект. В отличие от простых объектов как CFString и CFData, функции «CreateCopy» предусмотрели составные объекты, такие как CFArray, и CFSet фактически выполняют мелкую копию. В случае этих объектов мелкая копия означает, что новый объект коллекции создается, но содержание исходного набора не дублировано — только ссылки на объект копируются в новый контейнер. Этот тип копии полезен, если, например, у Вас есть массив, это является неизменным, и Вы хотите переупорядочить его. В этом случае Вы не хотите копировать все содержащие в нем объекты, потому что нет никакой потребности изменить их — и почему израсходовали ту дополнительную память? Вы просто хотите, чтобы был изменен набор включенных объектов. Те же риски применяются здесь как с копированием ссылок на объект с простыми типами.
Глубокая копия
Когда Вы хотите создать полностью новый составной объект, необходимо выполнить глубокую копию. Глубокая копия копирует составной объект, а также содержание всех его содержащих в нем объектов. Текущий выпуск Базовой Основы включает функцию, выполняющую глубоко копирование списка свойств (см. CFPropertyListCreateDeepCopy
). Если Вы хотите создать глубокие копии других структур, Вы могли бы выполнить глубокую копию сами путем рекурсивного убывания в составной объект и копирования всего его содержания один за другим. Заботьтесь в реализации этой функциональности, поскольку составные объекты могут быть рекурсивными — они могут прямо или косвенно содержать ссылку на себя — который может вызвать рекурсивный цикл.