当覆盖 initWithCoder 时,总是需要调用 [super initWithCoder: coder]

Posted

技术标签:

【中文标题】当覆盖 initWithCoder 时,总是需要调用 [super initWithCoder: coder]【英文标题】:When overriding initWithCoder is it always necessary to call [super initWithCoder: coder] 【发布时间】:2010-03-12 19:21:15 【问题描述】:

在这段代码中,我从 .xib 加载一个视图控制器(和关联的视图):

-(id)initWithCoder:(NSCoder *)coder
    
    // add custom initialisation code here
    [super initWithCoder:coder];
    return self;
    

这成功了,但我真的不明白 [super initWithCoder:coder] 行正在完成什么。这是在我的视图初始化后初始化我的视图控制器吗?

请在解释时尽可能明确。谢谢。

【问题讨论】:

仅供记录,如果您不熟悉这些东西。 (1) 有时(不总是)你碰巧想在类的“设置”中添加一些东西,当它启动时。 (2) IF 你碰巧需要这样做,你这样做的方式就是使用与上面完全相同的代码。但是请注意,(3) 上面的代码实际上什么也没做。事实上,非常简单,如果您需要“添加设置代码”到相关类中,它只不过是针对这种特定类型的类的您将做什么 的示例。 (事实上​​,你会“在第 3 行之前添加新的设置代码”。)有意义吗?! :) 【参考方案1】:

您的类是UIViewController 的子类。该调用告诉您的超级类 (UIViewController) 执行它需要完成的步骤,以便您可以执行初始化步骤。这将设置UIViewController 提供的任何属性或注册UIViewController 需要完成其工作的通知。

除了需要执行的步骤之外,几乎每次重写超类的方法时都建议调用超类的方法。

编辑:此外,如果您不需要在超类提供的方法中做任何事情,您可以将其省略,而将使用超类的方法。在这种情况下,我不会提供initWithCoder: 方法,除非除了您展示的内容之外,您还需要执行一些代码。

【讨论】:

明确一点,当我将 UIView 对象添加到 UIViewController.xib 时,Interface Builder 会自动从 UIViewController 继承我的 UIView 类?我确实看到,如果我从我的 UIView 自定义类中排除 initWithCoder 一切也正常加载,这是一个有用的提示。 只有当 .xib 中的 UI View 对象在 IB 的 Identity Inspector 中配置了子类名称(在自定义类下)时,才会创建 UIView 子类的实例。 卢卡斯 - 哈哈,谢谢好人:)(粗体很容易误解!:))

以上是关于当覆盖 initWithCoder 时,总是需要调用 [super initWithCoder: coder]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIView 的子类中同时覆盖 initWithFrame: 和 initWithCoder:?

init&initWithFrame&initWithCoder

什么时候使用 initWithCoder: 方法?

为啥出口不能在 initWithCoder 中初始化?

整理ViewController的生命周期和加载过程

仅当键盘覆盖输入字段时才向上移动视图