NSCopyObject считается вредным? - PullRequest
4 голосов
/ 10 августа 2010

В документации Xcode для NSCopyObject в разделе специальных соображений указано:

Эта функция опасна и ее очень трудно использовать правильно.Он используется как часть copyWithZone: любым классом, который может быть разделен на подклассы, очень подвержен ошибкам.При GC или при использовании Objective-C 2.0 зона полностью игнорируется.

Эта функция, вероятно, устарела после Mac OS X 10.6.

Почему ее трудно использоватьправильно?Он выполняет поверхностное (побитовое) копирование.Объекты не копируются и не сохраняются.Документация по этому вопросу достаточно ясна.

Если я не пропускаю другие причины, какова предпочтительная альтернатива для выполнения мелкой копии объекта?

Редактировать:

Есть веские причины хотеть сделать поверхностную копию.Один пример: у класса может быть много переменных экземпляра, большинство из которых являются примитивными типами (целочисленные, с плавающей точкой) или объектами, которые намеренно не сохраняются, чтобы избежать циклов сохранения (делегатов).Мелкая копия с использованием NSCopyObject копирует все это в одну красивую, самодокументированную строку кода.Любые оставшиеся ивары, для которых требуется подсчет ссылок, можно сохранить или скопировать по отдельности.

Альтернативой этому является либо присвоение новому объекту с использованием синтаксиса указателя (newObject->ivar = ivar), либо создание метода init спотенциально большое количество аргументов (один для каждого ивара для копирования).Последнее кажется мне особенно уродливым, но я полагаю, что это не обязательно должно быть в заголовке и показывать миру.

Ответы [ 2 ]

2 голосов
/ 08 апреля 2011

Может быть, вы найдете эту статью полезной:
http://robnapier.net/blog/implementing-nscopying-439

1 голос
/ 10 августа 2010

Вы не должны делать поверхностную копию, не связанную с правильным сохранением / выпускомПериод.

...