这个子类如何实例化?

时间:2014-08-08 13:45:43

标签: objective-c super subclassing

我正在查看名为PKRevealController的pod中的一些代码,这对我来说很奇怪。 pod定义了一个名为PKAnimation的CABasicAnimation的子类:

@interface PKAnimation : CABasicAnimation <PKAnimating>

然后它在实现中有一个工厂方法:

+ (id)animationWithKeyPath:(NSString *)path
{
    CABasicAnimation *animation = [super animationWithKeyPath:path];
    animation.delegate = animation;
    return animation;
}

此函数实际返回PKAnimation的实例。对我来说,它看起来应该返回一个CABasicAnimation。这是如何实现的?

1 个答案:

答案 0 :(得分:3)

当你调用[super something]时,你正在使用超类的方法实现,但该方法仍然在上调用调用当前方法的同一对象。换句话说,超级调用中的self与当前函数中的self相同 - PKAnimation类(或者您在此方法上调用的任何类)。

这取决于知道+[CABasicAnimation animationWithKeyPath:]创建了一个被调用的类的对象。但这是Cocoa中所有便利构造函数遵循的约定。它们总是使用[self alloc] ...而不是[SomeSpecificClass alloc] ...创建对象,因此,它总是使用类对象,在运行时调用方法(可以继承),而不是代码所在的类。物理上在编译时。

换句话说,如果PKAnimation 没有覆盖+animationWithKeyPath:,则调用[PKAnimation animationWithKeyPath:...]仍然返回一个对象类PKAnimation,即使它只是继承了CABasicAnimation的方法。现在,覆盖它,然后调用super实现,应该与不覆盖它没有区别 - 在这两种情况下,它都会得到一个PKAnimation对象。