Я думаю, что вы обнаружили большой разрыв между документацией и реальностью.
Заявка на документацию протокола NSCopying:
Возвращаемая копия является неизменной, если к получающему объекту применяется соображение «неизменный против изменяемого»; в противном случае точный характер копии определяется классом.
Но в некоторых случаях это явно неправильно, как вы показали в своих примерах (и я отправил им отзыв об этом через эту страницу документации).
Но (# 2), на мой взгляд, это на самом деле не имеет значения, и вам все равно.
Смысл -copy
в том, что он вернет объект, который вы можете использовать с гарантией того, что он будет вести себя независимо от оригинала. Это означает, что если у вас есть изменяемый объект, -copy
и изменить исходный объект, копия не увидит эффект. (В некоторых случаях, я думаю, это означает, что -copy
можно оптимизировать, чтобы ничего не делать, потому что, если объект неизменен, его нельзя изменить в первую очередь. Я могу ошибаться по этому поводу. (Мне сейчас интересно что это значит для ключей словаря из-за этого, но это отдельная тема ...))
Как вы видели, в некоторых случаях новый объект может действительно иметь изменяемый класс (даже если документация говорит нам, что это не так). Но до тех пор, пока вы не полагаетесь на его изменчивость (с чего бы это?), Это не имеет значения.
Что делать? Всегда обрабатывайте результат -copy
как неизменный , просто так.