16

我想知道 App Delegate 做了什么。它有一些很好的方法,比如-applicationDidFinishLaunching当应用程序完成启动时会调用它们,等等。但那实际上是什么?UIApplicationMain那是在函数中实例化的某个对象吗?

我的应用程序中的每个类都可以访问该 App Delegate 对象是如何工作的?网上有没有什么好的图表可以可视化这些关系?

4

2 回答 2

37

在 Cocoa 中,委托是另一个对象在行为问题上遵循的对象,并通知其状态的变化。例如,一个 UITableViewDelegate 负责回答有关 UITableView 在进行选择或重新排序时应该如何表现的问题。它是 UITableView 在想知道特定行的高度时询问的对象。在模型-视图-控制器范式中,委托是控制器,许多委托的名称以“控制器”结尾。

冒着明显的风险,UIApplicationDelegate 是 UIApplication 的委托。这种关系在 Cocoa (Mac) 中比在 Cocoa Touch (iPhone) 中更明显,因为 NSApplication 委托能够更直接地控制 NSApplication 的行为(例如防止应用程序终止)。iPhone 不允许对 UIApplication 进行太多控制,因此大多数情况下 UIApplicationDelegate 被告知更改,而不是有一个积极的决策过程。

UIApplicationDelegate 在应用程序的任何地方都不是严格可用的。单例 UIApplication 是 ([UIApplication sharedApplication]),通过它你可以找到它的委托。但这并不意味着应用程序中的每个对象都适合直接与应用程序委托对话。一般来说,我不鼓励开发人员让随机对象与应用程序委托对话。大多数通过这种方式解决的问题都可以通过 Singleton、NSNotification 或其他委托对象更好地解决。

至于它的创建,在 Mac 上,应用程序委托并没有什么神奇之处。在大多数情况下,它只是一个由 NIB 实例化和连接的对象。然而,在 iPhone 上,如果通过 UIApplicationMain() 实例化应用程序委托,可能会有点神奇。第四个参数是一个 NSString 表示应用程序代理的类,UIApplicationMain() 将创建一个并将其设置为 sharedApplication 的代理。这允许您在没有 NIB 的情况下设置委托(这在 Mac 上非常困难)。如果 UIApplicationMain() 的第四个参数为 nil(就像在 Apple 模板中一样),则委托由主 NIB 创建和连接,就像主窗口一样。

于 2009-05-06T13:35:10.313 回答
3

对象以这种方式实例化;

main-function 查找 info.plist 中设置的主要 nib。笔尖作为应用程序委托设置为某个必须实现 UIApplicationDelegates 及其所需方法的类。然后应用程序委托加载一些视图控制器。

它用作影响整个应用程序的事件的应用程序范围的回调对象,例如内存不足等。

于 2009-05-06T12:19:27.687 回答