【问题标题】:Super class method placement in child class [duplicate]子类中的超类方法放置[重复]
【发布时间】:2012-09-10 04:54:00
【问题描述】:

可能重复:
When should I call super?

在调用 [super viewDidLoad][super init][super viewDidUnload] 等超类方法时是否有区别/首选方式?我已经看到教程将它们放在第一行或作为子类方法的最后一行。我只是想知道是否会有任何依赖关系,比如超类方法是否会做一些设置,孩子可以使用 当预先调用时,或者超类是否可以对孩子所做的事情进行一些优化 最后调用时

【问题讨论】:

标签: objective-c ios inheritance initialization


【解决方案1】:

我的一般经验法则是,构造/创建行为首先通过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

【讨论】:

  • 我刚刚报道了init,但你完全正确。
【解决方案2】:

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

self = [super init];

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

这到底是为了什么?

@Justin 指出 Class Clusters(在返回 NSDictionary 或 NSString 的实例时使用)使用此机制根据任务提供略有不同的子类。单例也可以使用它,Objective-C 的(现已弃用)Pose 函数也可以。

【讨论】:

  • 我不知道这在实践中是否真的发生过,但你必须遵守规则。
  • 它确实发生了。类集群和单例是值得注意的例子。
  • 我想到了单身人士,然后一阵寒意袭来。在收到单例后初始化子类似乎不是一个好主意 - 原来的子类可能是不同的子类,或者有正在运行的数据。
  • 类集群 - developer.apple.com/library/mac/#documentation/General/…,这似乎是合理的。
  • 其中一些内容从我的脑海中掠过,但感谢 @justin 和 Alex-Brown 帮助我。正如贾斯汀在第一个答案中提到的那样,我现在对如何实现这一点有了更好的理解。
猜你喜欢
  • 1970-01-01
  • 2017-12-14
  • 2015-09-06
  • 1970-01-01
  • 2012-11-25
  • 2018-01-22
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
相关资源
最近更新 更多