好吧,这将是一个非常令人尴尬的问题,但我在初学者的书中看起来很疯狂(特别是那些通常有用的指数)并且,我没有找到对'超级'的实际解释在我的申请中。
我看了this here,但我担心这超出了我的范围。任何人都可以提供一个非常简单的解释,说明我的应用程序中有什么“超级”,以及为什么我应该成为它的朋友? E.g:
- (void)viewDidLoad {
[super viewDidLoad];}
谢谢!
答案 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
引用的方法始终是层次结构中以前方法的实现方法,它是不与将给出超类实例的实例方法集相同的集合(除非您的类要覆盖每个方法)。