copyWithZone: (глубокая копия) сбой в подклассе
Я пытаюсь создать метод копирования по протоколу NSCopying.
У меня есть следующий класс:
@interface Gene : NSObject <NSCopying>
{
int firstAllele;
int secondAllele;
}
с помощью метода:
-(id) copyWithZone:(NSZone*) zone
{
id clonedGene = [[[self class] allocWithZone:zone] initWithAllele1:first andAllele2:second];
return clonedGene;
}
если я вызываю метод следующим образом:
Gene* gene1 = [[Gene alloc]initWithAllele1:4 andAllele2:2];
Gene* gene2 = [gene1 copy];
происходит сбой при вызове метода копирования gene1.
я должен вызывать метод по-другому?
лайк [gene1 copyWithZone:(NSZone *)]
но какой объект мне придется передать? я должен создать объект NSZone? или есть по умолчанию, который я могу передать в качестве аргумента?
Спасибо за любую помощь
1 ответ
Я смог понять это:
Я изменил класс Джина на:
@interface Gene : NSObject
{
Allele * first;
Allele * second;
}
Мне нужно было также создать копии объектов, которые я добавил, так же как и вспомогательные объекты, необходимые для подтверждения в протоколе копирования:
-(id) copyWithZone:(NSZone*) zone
{
id clonedGene = [[[self class] allocWithZone:zone] initWithAllele1:[first copy] andAllele2:[second copy]];
return clonedGene;
}
поэтому я должен был определить также
-(id) copyWithZone:(NSZone*) zone;
Метод в классе Allele:
-(id) copyWithZone:(NSZone*) zone
{
id copiedAllele = [[[self class] allocWithZone:zone] initWithAllele:allele];
return copiedAllele;
}
и поскольку аллель относится к типу перечисления, ему не требуется реализовывать более глубокий метод копирования (так как это базовый тип).
Поэтому, если я хочу реализовать метод глубокого копирования, я должен убедиться, что во всех классах, используемых в качестве атрибутов, также реализована функция копирования.
Спасибо за помощь, надеюсь, нормально, что я ответил на свой вопрос.
С уважением