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;  
}

и поскольку аллель относится к типу перечисления, ему не требуется реализовывать более глубокий метод копирования (так как это базовый тип).

Поэтому, если я хочу реализовать метод глубокого копирования, я должен убедиться, что во всех классах, используемых в качестве атрибутов, также реализована функция копирования.

Спасибо за помощь, надеюсь, нормально, что я ответил на свой вопрос.

С уважением

Другие вопросы по тегам