子类中的超类方法放置

时间:2012-09-10 04:54:00

标签: objective-c ios inheritance initialization

  

可能重复:
  When should I call super?

在调用超级类方法(例如[super viewDidLoad][super init][super viewDidUnload]时,是否存在差异/首选方式?我已经看过教程将它们放在第一行或作为子类方法的最后一行。我只是想知道是否会有任何依赖性,如果超类方法会做一些设置,孩子可以使用当被调用前面时,或者如果超级可以对孩子做过的事情进行一些优化最后调用时

2 个答案:

答案 0 :(得分:4)

我的一般经验法则是构造/创建行为首先通过super调用,而破坏或拆除状态的行为则以相反的顺序发生 - super最后调用。很少需要偏离它。

原因通常不是优化(如您的帖子中所述),而是可预测的语义

示例A:

构造

- (id)init
{
  self = [super init]; // << set up super
  if (0 != self) {
    // set up self
  ...

破坏:

- (void)dealloc
{
  [ivar release], ivar = 0; // << tear down self
  [super dealloc]; // << tear down super

例B:

构造

- (void)viewWillAppear:(BOOL)pAnimated
{
  [super viewWillAppear:pAnimated]; // << call through super first
  // now set up self
  ...

破坏:

- (void)viewDidDisappear:(BOOL)pAnimated
{
  // tear down self
  [super viewDidDisappear:pAnimated]; // << now tear down super

答案 1 :(得分:0)

您必须首先初始化超级 ,因为超级构造函数可以选择返回self原始值以外的值。

self = [super init];

如果在致电self之前初始化[super init]的其他属性,则可能会删除这些更改。

究竟是为了什么?

@Justin注意到Class Clusters(在返回NSDictionary或NSString的实例时使用)使用此机制根据任务提供稍微不同的子类。单身人士也可以使用它,而Objective-C的(现已弃用)Pose功能也可以使用。