在我的应用中,“超级”究竟做了什么?

时间:2011-03-11 21:18:29

标签: iphone objective-c cocoa-touch super

好吧,这将是一个非常令人尴尬的问题,但我在初学者的书中看起来很疯狂(特别是那些通常有用的指数)并且,我没有找到对'超级'的实际解释在我的申请中。

我看了this here,但我担心这超出了我的范围。任何人都可以提供一个非常简单的解释,说明我的应用程序中有什么“超级”,以及为什么我应该成为它的朋友? E.g:

- (void)viewDidLoad {
[super viewDidLoad];}

谢谢!

2 个答案:

答案 0 :(得分:6)

super调用超类的方法实现。因此,如果您的类继承UIViewController,那么[super viewDidLoad];将调用UITableViewController类的viewDidLoad方法。你通常应该这样做,因为超类可能会做一些需要发生的重要事情。在viewDidLoad的情况下,我不确定它实际上当前做了什么,但它总是可以在框架的未来版本中。

答案 1 :(得分:2)

在低级别,self包含指向它响应的set方法的指针。这是实现动态调度的基本机制。每个类都有一个独特的集合。如果你熟悉c ++,这在概念上类似于虚拟表。你可以认为objc方法就像一个带有2个隐藏参数的C函数(self,_cmd)。

super是动态创建的self表示,带有指向实例超类实现的下一行方法的指针。此表示基于self,只是指向另一组已实现的方法。

@interface MONTypeA : NSObject
- (void)monMethod;
@end

@interface MONTypeB : MONTypeA
- (void)monMethod;
@end

@implementation MONTypeA

- (void)monMethod {
    printf("i am MonTypeA\n");
}

@end

@implementation MONTypeB

- (void)monMethod {
    [super monMethod]; /* << will call -[MONTypeA monMethod], which will print "i am MonTypeA\n" */
    printf("i am MonTypeB\n");
}

@end

如果您创建MONTypeA的实例,那么它将回复monMethod

MONTypeA * a = [MONTypeA new];
[a monMethod];
[a release], a = 0;

// outputs: "i am MonTypeA\n"

MONTypeB * b = [MONTypeB new];
[b monMethod];
[b release], b = 0;

// outputs: "i am MonTypeA\n""i am MonTypeB\n" because -[MONTypeB monMethod] calls through super

因此,在这种特定情况下,调用super执行超类方法的实现。

重要的是要记住:方法super引用的方法始终是层次结构中以前方法的实现方法,它是与将给出超类实例的实例方法集相同的集合(除非您的类要覆盖每个方法)。