В документации Xcode для NSCopyObject
в разделе специальных соображений указано:
Эта функция опасна и ее очень трудно использовать правильно.Он используется как часть copyWithZone:
любым классом, который может быть разделен на подклассы, очень подвержен ошибкам.При GC или при использовании Objective-C 2.0 зона полностью игнорируется.
Эта функция, вероятно, устарела после Mac OS X 10.6.
Почему ее трудно использоватьправильно?Он выполняет поверхностное (побитовое) копирование.Объекты не копируются и не сохраняются.Документация по этому вопросу достаточно ясна.
Если я не пропускаю другие причины, какова предпочтительная альтернатива для выполнения мелкой копии объекта?
Редактировать:
Есть веские причины хотеть сделать поверхностную копию.Один пример: у класса может быть много переменных экземпляра, большинство из которых являются примитивными типами (целочисленные, с плавающей точкой) или объектами, которые намеренно не сохраняются, чтобы избежать циклов сохранения (делегатов).Мелкая копия с использованием NSCopyObject
копирует все это в одну красивую, самодокументированную строку кода.Любые оставшиеся ивары, для которых требуется подсчет ссылок, можно сохранить или скопировать по отдельности.
Альтернативой этому является либо присвоение новому объекту с использованием синтаксиса указателя (newObject->ivar = ivar
), либо создание метода init спотенциально большое количество аргументов (один для каждого ивара для копирования).Последнее кажется мне особенно уродливым, но я полагаю, что это не обязательно должно быть в заголовке и показывать миру.