【问题标题】:Start with init method or not?是否从init方法开始?
【发布时间】:2011-07-18 10:43:44
【问题描述】:

我想知道我们什么时候在项目中使用“init”方法?我见过很多没有它的项目,他们使用“applicationDidFinishLaunching”来启动应用程序,而不是init方法,你知道吗?

非常感谢

【问题讨论】:

    标签: iphone objective-c ios init


    【解决方案1】:

    init 方法用于在分配对象后对其进行初始化。 如果未定义,则调用基类实现,与 Objective-C 中的任何其他方法一样,如果基类没有init 方法,则基类'基类'init 将被调用,依此类推,直到NSObjectinit,这是肯定提供的。

    如果您不声明 init 方法,那么您将无法正确初始化您的类中的 ivars(如果有的话)。

    关于applicationDidFinishLaunching,这是任何Cocoa/iOS 应用程序都有的一个非常特殊的类的方法,它的应用程序委托。例如:

     @interface myAppDelegate : NSObject <UIApplicationDelegate> {
     ...
     }
    

    (注:UIApplicationDelegate 也可以是 NSApplicationDelegate

    如您所见,该类派生自 NSObject,因此,它将由框架通过调用该类中定义的 init 方法(具体取决于框架)来初始化。然后,在某个时候,框架将调用applicationDidFinishLaunching 方法,您可以进行更改以初始化所有代理的成员并执行启动应用程序所需的任何操作。

    在这种情况下,您不需要在 init 方法中而是在 applicationDidFinishLaunching 中进行初始化这一事实与您的 UIApplication(或 NSApplication)对象与其委托之间的特定交互模式有关。这种模式是苹果这样定义的;

    1. 您在 MainWindow.xib 中或在 main.c 中调用 UIApplicationMain 时指定应用程序委托类;

    2. 框架负责实例化这些类(以程序员不需要处理的自定义方式)并调用applicationDidFinishLaunching,以便您可以用它做任何您需要的事情。

      李>

    我希望这个解释可以帮助您了解应用程序委托发生了什么以及您为什么不声明 init 方法。

    【讨论】:

    • 谢谢,我可以问你一些问题吗?所以如果我有 ivars(实际上几乎总是这样?)我应该声明一个 init 方法,所以几乎每次?另外,我不太了解 applicationDid... 的内容:“与特定的交互模式有关...以及 Apple 决定使用的代表”,您能帮我解释一下吗?我很确定我没有在你的解释中得到这个东西;)
    • 是的,几乎每次你都需要一个 init 方法。 Objective-C ivars 默认初始化为nil,但我认为为了可读性和可维护性,如果你有 ivars,你最好定义一个init 方法。另请阅读我对“交互”部分的编辑...
    【解决方案2】:

    实现 init 方法是不必要的,除非你想做一些自定义初始化。

    Doc 说,

    子类应覆盖 init 方法以添加特定于类的初始化代码。 init 的子类版本需要通过向 super:

    发送消息来合并它们所继承的类的初始化代码

    【讨论】:

    • 感谢 EmptyStack 的回答
    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2020-02-12
    • 2023-03-18
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多