2

可能重复:
我什么时候应该打电话给超级?

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

4

2 回答 2

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
于 2012-09-10T05:18:00.337 回答
0

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

self = [super init];

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

那到底是为了什么?

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

于 2012-09-10T05:15:53.980 回答