我尝试创建一个赋予协议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对象?或者我可以作为参数传递一个默认值吗?
感谢您的帮助
答案 0 :(得分: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;
}
因为allele属于枚举类型,所以不需要实现更深层次的复制方法(因为它是基本类型)。
因此,如果我想实现深度复制方法,我必须确保所有用作属性的类都具有实现的复制功能。
感谢您的帮助,我希望我能回答我自己的问题。
亲切的问候