【问题标题】:When should I call super?我什么时候应该打电话给超级?
【发布时间】:2011-04-23 19:56:38
【问题描述】:

[super ... any method name] 的最佳用途是什么。最近我发现在 dealloc 中 [super dealloc] 必须站在同一端。因为之前没有使用的任何变量,如果我们在[super dealloc]之后设置它,就会被垃圾填充,这是一种罕见的事情,但它是可能的。在此之后,我们的应用程序将崩溃。

那么 super 方法的最佳使用是什么,例如 -(void)viewWillAppear:(BOOL)animated 最好使用什么。 [super viewWillAppear:(BOOL)animated] 在正文开头或结尾的最佳位置在哪里?

【问题讨论】:

    标签: objective-c oop inheritance


    【解决方案1】:

    通常的经验法则是,当您覆盖进行某种初始化的方法时,您首先调用 super,然后执行您的操作。当你重写某种拆卸方法时,你调用 super last:

    - (void) setupSomething {
        [super setupSomething];
        …
    }
    
    - (void) tearDownSomething {
        …
        [super tearDownSomething];
    }
    

    第一类是init…viewWillAppearviewDidLoadsetUp等方法。第二个是deallocviewDidUnloadviewWillDisappeartearDown。这不是硬性规定,它只是从方法所做的事情中得出的。

    【讨论】:

    • 另外值得注意的是,在 ARC 下,您在 dealloc 实现中根本不必调用 [super dealloc]
    • 这根本不可能,如果你这样做,编译器会打你。
    【解决方案2】:

    只需检查相应的文档即可。比如UIViewController的重写方法中何时调用super:

    didReceiveMemoryWarning:你可以 覆盖此方法(根据需要) 释放所使用的任何额外内存 你的视图控制器。如果你这样做,成为 一定要调用 super 实现 在某些时候允许查看 控制器释放其视图。 [表示顺序不重要。]

    loadView :您的自定义实现 这个方法不应该调用super

    setEditing:animated:这个方法 应该调用 super 的实现 在更新其视图之前。 [表示顺序很重要。]

    viewWillAppearviewDidAppearviewWillDisappearviewDidDisappear: 如果您覆盖此方法,则必须 在你的某个时刻调用 super 执行。 [表示顺序不重要。]

    dealloc:如果你实现了这个方法 但是正在构建您的应用程序 iOS 2.x,你的 dealloc 方法应该 释放每个对象,但也应该 将该对象的引用设置为 在调用 super 之前为零。 [表示顺序很重要。]

    你是否意识到在 viewDidLoad 和 viewDidUnload 方法中没有提到 super 的类似规则?因为你不需要在这些中调用 super。

    【讨论】:

    • 提醒一句:在处理更深层次的层次结构时必须小心。如果 A 继承自 UIVIewController 并覆盖 viewDidLoad,而 B 继承自 A 并覆盖 viewDidLoad,则可能是在 B 的实现中发送 [super viewDidLoad] 是强制性的。正如 Comptrol 所说,A 的文档应该明确说明,实现 B 的开发人员应该阅读 A 的文档。
    【解决方案3】:

    这主要取决于您的子类是否需要在超类方法之前或之后发生事情。或两者兼有,视情况而定。

    这就是为什么 init 方法首先调用 super 方法,最后调用 dealloc 方法。在您的示例中,当您被通知将出现视图时,您可能希望让超级完成它的事情,然后,处理您的子类视图需要做的任何事情。但可以想象它可能是其他方式,或者您可以在代码之间调用超级方法。将根据您的应用程序的需要应用不同的规则。

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      相关资源
      最近更新 更多