【问题标题】:Relationship between AppDelegate and main.mAppDelegate 与 main.m 的关系
【发布时间】:2011-03-28 16:49:21
【问题描述】:

好的,我对 obj-c + cocoa 完全陌生,所以这可能很明显,但这里是:

在学习如何在 Xcode 中使用 Objective-c 时,我一直在从命令行应用转移到可可应用。我不太明白的一件事是 AppDelegate 的作用以及它如何连接到 main.m

看起来你可以把你的整个程序放在 appdelegate 中,它会运行良好,你甚至不需要 main.m,但不是相反,如果你正在制作一个可可应用程序,你必须至少有 appdelegate。

我做过很多 php web 开发和命令行工具,所以我想我正在寻找的是程序将首先执行的文件,旨在“控制”其余部分。

谁能帮我理解 Cocoa 程序中发生了什么,AppDelegate 和 main.m 是(或不)相关的,以及程序的流程应该是什么?

【问题讨论】:

    标签: objective-c cocoa delegates


    【解决方案1】:

    main.m 包含main() 函数,它是程序的入口点,它首先运行。然后它调用UIApplicationMain(),它执行特定于操作系统的应用程序设置工作,并加载包含您的应用程序委托实例的主界面生成器.xib 文件。

    也就是说,如果没有main.m,您的应用代理甚至都不会被加载。

    【讨论】:

    • 重要的一点是main.m 基本上是样板代码,它只是将所有内容设置为运行UIApplicationMain()。很少需要在main() 中添加或更改任何内容。所以应用委托是“你的代码”开始的地方。
    • 好的,这个答案和评论很有意义,main() 只是启动程序,它做的第一件事就是让 UI 运行,这意味着应用程序委托正在运行。
    • @Andrew 是的,没错。还应该注意,UIApplicationMain() 可以根据需要直接创建您的应用程序委托,而不是从 nib 文件中加载它(您将类名作为参数之一传递)。如果我的回答对您有用,请通过单击计票下方的复选标记将其标记为正确。谢谢:)
    【解决方案2】:

    许多面向对象系统(如Cocoa)的一个关键特性是"inversion of control",这基本上意味着框架正在运行一切,你编写的任何代码都在它的控制之下。

    因此,与 PHP 不同,您不必编写在启动时执行的代码。您所做的是为应用程序委托、控制器、视图和其他对象定义方法,并让框架在需要时调用这些方法。您将永远看不到整个程序的整体“控制流程”;您只会将其视为控制流入程序的各个部分。

    起初这可能会让人感到困惑,因为您试图弄清楚如何欺骗框架以您期望的时间和顺序调用您的代码,但从长远来看,它实际上会让事情变得更容易,您可以相信为您处理很多事情的框架。

    在 Cocoa 应用程序中,应用程序的许多逻辑实际上都在视图控制器中,而不是在应用程序委托中。应用程序委托通常处理启动和关闭职责,但其他对象完成启动和关闭之间的大部分工作。所以不要试图把所有东西都挤进应用程序委托中。

    【讨论】:

    • +1。所有伟大的信息,虽然没有直接解决这个问题。请参阅 jtbandes 对主要与应用程序委托部分的回答。
    • 它没有解决关于 main.m 与应用程序委托的问题部分,但我认为它确实解决了“程序的流程应该是什么”部分,即我认为提问者真正想弄清楚的是什么。
    • 这很有帮助!我一直难以理解的部分是代码中究竟需要发生什么,以便框架能够在我想要的时候使用特定的方法。控制器文件(例如,controller.m 和 controller.h)与 UI 之间的确切联系是什么。我应该将输入挂钩到 AppDelegate,然后让 AppDelegate 将数据中继到控制器,或者直接从 UI 连接到控制器?
    • 我只能说“这取决于”。如果您有一些全局应用程序范围的数据需要多个控制器访问,那么应用程序委托可能是放置它的地方。但是,仅由控制器和它自己创建的任何子控制器使用的数据应该驻留在该控制器中。这篇文章可能会有所帮助:cocoawithlove.com/2008/11/…
    猜你喜欢
    • 2013-11-17
    • 2019-12-28
    • 2012-10-07
    • 2011-09-15
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    相关资源
    最近更新 更多