copyWithZone: (глубокая копия) сбой в подклассе - PullRequest
2 голосов
/ 26 марта 2011

Я пытаюсь создать метод копирования, используя протокол 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 Ответ

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

Мне удалось выяснить это:

Я изменил класс Gene на:

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

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

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

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

С уважением

...