好的,这将是一个非常尴尬的问题,但我在我的初学者书籍(尤其是那些通常有用的索引)中看起来很疯狂,看哪,我没有找到关于“超级”在我的应用程序。
我在这里看过这个,但恐怕这远远超出了我的范围。谁能提供一个非常简单的解释来解释“超级”在我的应用程序中的作用以及为什么我应该与它成为朋友?例如:
- (void)viewDidLoad {
[super viewDidLoad];}
谢谢!!
好的,这将是一个非常尴尬的问题,但我在我的初学者书籍(尤其是那些通常有用的索引)中看起来很疯狂,看哪,我没有找到关于“超级”在我的应用程序。
我在这里看过这个,但恐怕这远远超出了我的范围。谁能提供一个非常简单的解释来解释“超级”在我的应用程序中的作用以及为什么我应该与它成为朋友?例如:
- (void)viewDidLoad {
[super viewDidLoad];}
谢谢!!
super
调用超类的方法实现。因此,如果您的类继承UIViewController
,那么[super viewDidLoad];
将调用UITableViewController
该类的viewDidLoad
方法。您通常应该这样做,因为超类可能会做一些需要发生的重要事情。在 viewDidLoad 的情况下,我不确定它当前实际上做了什么,但它总是可以在框架的未来版本中。
在底层,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
所指的方法集始终是层次结构中方法的先前实现的方法集,它与将给出超类实例的实例方法集不同(除非您的类将覆盖每个方法)。