(Предполагая, что вам нужна глубокая копия) для копии, которую мы хотим сделать, используйте copyWithZone: для переменных экземпляра объекта и просто установите примитивные переменные экземпляра, используя =.
- (id)copyWithZone:(NSZone *)zone
{
MyClass *copy = [[MyClass alloc] init];
// deep copying object properties
copy.objectPropertyOne = [[self.objectPropertyOne copyWithZone:zone] autorelease];
copy.objectPropertyTwo = [[self.objectPropertyTwo copyWithZone:zone] autorelease];
...
copy.objectPropertyLast = [[self.objectPropertyLast copyWithZone:zone] autorelease];
// deep copying primitive properties
copy.primitivePropertyOne = self.primitivePropertyOne
copy.primitivePropertyTwo = self.primitivePropertyTwo
...
copy.primitivePropertyLast = self.primitivePropertyLast
// deep copying object properties that are of type MyClass
copy.myClassPropertyOne = self.myClassPropertyOne
copy.myClassPropertyTwo = self.myClassPropertyTwo
...
copy.myClassPropertyLast = self.myClassPropertyLast
return copy;
}
Но обратите внимание, как свойства того же класса, что и self и copy, должны быть установлены без copyWithZone :. В противном случае эти объекты снова вызовут этот copyWithZone и попытаются установить свои myClassProperties, используя также copyWithZone. Это вызывает нежелательный бесконечный цикл. (Кроме того, вы можете вызвать allocWithZone: вместо alloc: но я уверен, что alloc: вызывает allocWithZone: в любом случае)
В некоторых случаях использование = для глубокого копирования свойств объекта одного и того же класса может быть не тем, что вы хотите делать, но во ВСЕХ СЛУЧАЯХ (насколько я знаю) глубокое копирование свойств объекта одного и того же класса с помощью copyWithZone: или все, что вызывает copyWithZone: приведет к бесконечному циклу.