2

好的,这将是一个非常尴尬的问题,但我在我的初学者书籍(尤其是那些通常有用的索引)中看起来很疯狂,看哪,我没有找到关于“超级”在我的应用程序。

我在这里看过这个,但恐怕这远远超出了我的范围。谁能提供一个非常简单的解释来解释“超级”在我的应用程序中的作用以及为什么我应该与它成为朋友?例如:

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

谢谢!!

4

2 回答 2

6

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

于 2011-03-11T21:21:22.283 回答
2

在底层,self包含一个指向它响应的 set 方法的指针。这是实现动态调度的基本机制。每个类都有一个唯一的集合。如果您熟悉 C++,这在概念上类似于虚拟表。您可以将 objc 方法视为具有 2 个隐藏参数(self、_cmd)的 C 函数。

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所指的方法集始终是层次结构中方法的先前实现的方法集,它将给出超类实例的实例方法集不同(除非您的类将覆盖每个方法)。

于 2011-03-11T22:44:44.397 回答