从init方法开始还是不从init方法开始?

5
我在想,在项目中我们何时使用"init"方法?我看到许多项目没有使用它,而是使用"applicationDidFinishLaunching"来启动应用程序,但没有使用init方法,你对此有什么想法吗?
非常感谢。
2个回答

3
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...: "与特定交互模式相关...和其代理,苹果决定使用",你能为我解释一下吗?我很确定我没有理解你的解释中的东西 ;) - Paul
是的,几乎每次你都需要一个初始化方法。Objective-C的实例变量默认初始化为nil,但我认为为了可读性和可维护性,如果你有实例变量,最好定义一个init方法。还请阅读我对“交互”部分的编辑... - sergio

1

除非您想进行一些自定义初始化,否则不需要实现init方法。

文档中提到:

子类应该重写init方法以添加特定于类的初始化代码。init的子类版本需要通过向super:发送消息来合并它们从中继承的类的初始化代码:


感谢EmptyStack的回答。 - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接