我正在查看名为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。这是如何实现的?
答案 0 :(得分:3)
当你调用[super something]
时,你正在使用超类的方法实现,但该方法仍然在上调用调用当前方法的同一对象。换句话说,超级调用中的self
与当前函数中的self
相同 - PKAnimation
类(或者您在此方法上调用的任何类)。
这取决于知道+[CABasicAnimation animationWithKeyPath:]
创建了一个被调用的类的对象。但这是Cocoa中所有便利构造函数遵循的约定。它们总是使用[self alloc] ...
而不是[SomeSpecificClass alloc] ...
创建对象,因此,它总是使用类对象,在运行时调用方法(可以继承),而不是代码所在的类。物理上在编译时。
换句话说,如果PKAnimation
没有覆盖+animationWithKeyPath:
,则调用[PKAnimation animationWithKeyPath:...]
将仍然返回一个对象类PKAnimation
,即使它只是继承了CABasicAnimation
的方法。现在,覆盖它,然后调用super
实现,应该与不覆盖它没有区别 - 在这两种情况下,它都会得到一个PKAnimation
对象。