copyWithZone返回超类的对象

11 iphone objective-c

我有这样的类层次结构:

  • ClassA 继承自 NSObject
  • ClassB 继承自 ClassA
  • ClassA实现copyWithZone:这样的:

执行:

-(id)copyWithZone:(NSZone *)zone
{
    ClassA *clone = [[ClassA allocWithZone:zone] init];
    // other statements
    return clone;
}
Run Code Online (Sandbox Code Playgroud)

ClassB 实现像这样的方法

-(id)copyWithZone:(NSZone *)zone
{
    ClassB *clone = [super copyWithZone:zone];
    // other statements
    return clone;
}
Run Code Online (Sandbox Code Playgroud)

ClassC 有这样的属性:

@property(nonatomic, copy) ClassA *classA;
Run Code Online (Sandbox Code Playgroud)

所以,当我做这样的事情时:

 ClassB *classBPtr = [[ClassB alloc] init];
 ClassC *classCPtr = [[ClassC alloc] init];
 [classCPtr setClassA:classBPtr];
 // other code
Run Code Online (Sandbox Code Playgroud)

某种程度上,该classA属性ClassC永远不会意识到classA指针实际上指向的是一个实例ClassB.因此,如果我调用一个方法classA,它只会调用基类的实现(在其中ClassA)而不是在派生类实现中ClassB

我可能搞砸了什么想法?

dea*_*rne 26

尝试改变

ClassA *clone = [[ClassA allocWithZone:zone] init];
Run Code Online (Sandbox Code Playgroud)

ClassA *clone = [[[self class] allocWithZone:zone] init];
Run Code Online (Sandbox Code Playgroud)