【问题标题】:When to call [super viewDidLoad] and [super viewDIdUnload]?何时调用 [super viewDidLoad] 和 [super viewDIdUnload]?
【发布时间】:2012-10-11 19:43:20
【问题描述】:

在我的大部分代码中,我对 viewDidLoad 和 viewDidUnload 进行了以下设置:

- (void)viewDidLoad
{
    [super viewDidLoad];

    //do stuff...
}

- (void)viewDidUnload
{
    [super viewDidUnload];

    //do stuff...
}

但是,我想知道...调用 viewDidLoad 和 viewDidUnload 是否重要?每个人应该在我“做事”之前还是之后?

换句话说,每个都应该在方法的开头还是结尾?

编辑:更复杂的是,这是 Apple 的默认 viewDidUnload 方法,“似乎”建议首先调用 [super viewDidUnload]...

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

【问题讨论】:

  • 方案是先调用超级构造函数,最后调用超级析构函数。
  • 这取决于您是否觉得您的代码需要在 super 类执行其操作之前运行。在这种情况下,只需先调用它。在最后调用 ARC [super dealloc] 之前,因为在 super 销毁类之后使用该类没有意义(未定义的行为)。

标签: objective-c ios viewdidload viewdidunload


【解决方案1】:

我确实在 destructors 中最后调用 super,在 constructors 中首先调用。 viewDidUnload 是一种析构函数,所以我会最后调用它。但在这种情况下,这是品味问题。

另外,请注意 - 自 iOS 6 起,viewDidUnload 已被弃用。

【讨论】:

  • 所以这只是口味问题,实际上没关系?我一直在想,也许它也应该是最后一个......但是在 Apple 的默认 viewDidLoad 方法中看起来它应该是第一个......
  • @MikeS 不,这个“构造函数”需要始终首先被调用。析构函数取决于-如果超类实际上释放了里面的对象,那么首先调用它会调用UB,所以我建议最后调用它。
  • 是的,首先在viewDidLoad 中调用它,然后在viewDidUnload 中最后调用它,这样你就安全了。但在viewDidUnload中是第一个还是最后一个都没有关系。
  • 嗯,我当然理解其中的原因,但是有这方面的文档吗?再次,似乎在 Apple 的方法 [super viewDidUnload] 中首先调用(更新了我的帖子以显示 Apple 的默认方法)然而,常识似乎说最后调用它。
  • 简单规则 - 如果您必须或不得致电super,您总是可以在文档中找到信息。但我什至不记得在文档中提到顺序的一种方法(除了 constructor 总是第一个)。
【解决方案2】:

假设你有 2 个班级,一个父母和一个孩子。子继承自父。他们有一个名为 greet 的方法,它返回一个字符串。

父方法如下所示:

代码:

-(NSString *)greet {
     return @"Hello";
 }

我们希望孩子向父母学习。所以我们用 super 来表示妈妈会如何打招呼,但也有我们自己的小补充。

代码://从父级继承

 -(NSString *)greet {
     NSString *parentGreeting = [super greet];
     return [parentGreeting stringByAppendingString:@", Mommy"]
   } 

所以现在父母打招呼“你好”,孩子打招呼“你好,妈妈”。稍后,如果我们将父母的问候语更改为仅返回“Hi”,那么两个类都会受到影响,您将拥有“Hi”和“Hi, Mommy”。

super 用于调用超类定义的方法。它用于访问已被子类覆盖的方法,以便类可以将自己的代码包装在其父类实现的方法周围。如果您要进行任何类型的继承,这将非常方便。

【讨论】:

    猜你喜欢
    • 2012-08-08
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    相关资源
    最近更新 更多