我有这样的类层次结构:
ClassA
继承自NSObject
ClassB
继承自ClassA
ClassA
实现copyWithZone:
,如下所示:实现:
-(id)copyWithZone:(NSZone *)zone
{
ClassA *clone = [[ClassA allocWithZone:zone] init];
// other statements
return clone;
}
ClassB
实现与此相同的方法
-(id)copyWithZone:(NSZone *)zone
{
ClassB *clone = [super copyWithZone:zone];
// other statements
return clone;
}
ClassC
有这样的属性:
@property(nonatomic, copy) ClassA *classA;
所以,当我做这样的事情时:
ClassB *classBPtr = [[ClassB alloc] init];
ClassC *classCPtr = [[ClassC alloc] init];
[classCPtr setClassA:classBPtr];
// other code
某种程度上classA
的{{1}}属性从未意识到ClassC
指针实际指向classA
的实例。因此,如果我在ClassB
上调用一个方法,它只会调用基类的实现(classA
中的实现)而不是ClassA
中的派生类实现
我可能搞砸了什么想法?
答案 0 :(得分:26)
尝试更改
ClassA *clone = [[ClassA allocWithZone:zone] init];
到
ClassA *clone = [[[self class] allocWithZone:zone] init];
答案 1 :(得分:2)
ClassA
-(id)copyWithZone:(NSZone *)zone
{
ClassA *copyObject = NSCopyObject(self, 0, zone);
//copy ClassA members here
return copyObject;
}
ClassB
-(id)copyWithZone:(NSZone *)zone
{
ClassB *copyObject = [super copyWithZone:zone];
//copy ClassB members here
return copyObject;
}