2

プロトコル 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 の copy メソッドを呼び出しているときにクラッシュします。

メソッドを別の方法で呼び出す必要がありますか?

好きです[gene1 copyWithZone:(NSZone *)]が、どのオブジェクトを渡す必要がありますか? NSZone オブジェクトを作成する必要がありますか? または、引数として渡すことができるデフォルトのものはありますか?

助けてくれてありがとう

4

1 に答える 1

2

私はそれを理解することができました:

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

また、対立遺伝子は列挙型であるため、より深いコピー メソッドを実装する必要はありません (基本型であるため)。

したがって、ディープ コピー メソッドを実装する場合は、属性として使用されるすべてのクラスにもコピー機能が実装されていることを確認する必要があります。

助けてくれてありがとう、私は自分の質問に答えて大丈夫だといいのですが。

敬具

于 2011-04-05T00:23:29.110 に答える