AppDelegate的用途是什么?如何知道何时使用它?


146

我刚刚开始在iPhone应用程序上工作。我怎么知道什么时候应该在AppDelegate和自定义类中放东西?是否存在与使用AppDelegate类模式的另一种编程语言(如Python或PHP)相类似的规则或任何类型?

Answers:


255

我通常避免使用安德鲁(Andrew)使用“应用程序的心脏”一词所暗示的设计方法。我的意思是,我认为您应该避免将过多的内容混为一谈-好的程序设计通常涉及通过“关注区域”将功能分开。

委托对象是一个当其连接的对象达到某些事件或状态时会得到通知的对象。在这种情况下,Application Delegate是一个对象,当UIApplication对象达到某些状态时,它将接收通知。在许多方面,它是一种专门的一对一观察者模式。

这意味着AppDelegate的“关注区域”正在处理特殊的UIApplication状态。其中最重要的是:

  • applicationDidFinishLaunching:-非常适合处理启动时的配置和构建
  • applicationWillTerminate:-适用于最后清理

您应该避免将其他功能放到AppDelegate中,因为它们并不真正属于那里。这些其他功能包括:

  • 文档数据-您应该有一个文档管理器单例(对于多个文档应用程序)或一个文档单例(对于单个文档应用程序)
  • 按钮/表/视图控制器,视图委托方法或其他视图处理(在applicationDidFinishLaunching:中构建顶级视图除外)—这项工作应在各自的视图控制器类中进行。

许多人因为懒惰或认为AppDelegate控制着整个程序而将这些东西混入AppDelegate中。您应该避免集中在您的AppDelegate中,因为它会使应用程序中需要关注的领域变得混乱,并且无法扩展。


8
+1这是一个很好的答案。我正在看一些带有子视图的示例代码,这些子视图调用appDelegate来指示视图控制器切换到另一个子视图,并且感觉像代码的味道。很高兴知道我的鼻子仍然有效。
艾伦(Alan)

2
有时我们会在在线教程中看到类似的内容:AppDelegate * del = [AppDelegate sharedAppDelegate]; (请参阅developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…)是什么意思?我可以看到使用它的示例,但我不太了解它的背后的原理(请参阅此示例:developer.apple.com/library/ios/#samplecode/…
Abbood 2012年

27

您的应用程序代表是您应用程序的核心。它实际上是您的“程序控制器”。

Application Delegate是接收应用程序级消息的类,其中包括最常用于启动其他视图创建的applicationDidFinishLaunching消息。

虽然不完全相似,但您可以将其视为Cocoa程序的“ main()”例程。


我给您+1,因为在AppDelegate中拥有所有UI控制器比为它创建所有那些自定义类要麻烦得多。
rwols

3
@rwols小心翼翼,将您的关注点分开有助于更清晰的代码,并且调试起来不那么麻烦,您应该花时间创建那些自定义类,而不要将所有观察者放在单个文件中。
Wheeliez'3

2

@Shivam,谢谢。

据我了解appDelegate,它接近ApplicationAndroid中的。的viewDidLoadviewDidDisappear相当于什么Android的生命周期。从启动到呼叫中断到显示通知,每个应用程序都有生命周期。如果您需要代码在system发生这些事件时做一些特殊的事情,那么您需要编写方法的代码。

在Android中,我们使用onPauseonDestroyonCreate还挺回调方法来处理这样的系统事件。


onPauseonCreateonDestroyAndroid的方法都比较类似viewDidDisappearviewDidLoad在iOS视图控制器生命周期的方法。如果您必须进行比较,我会说ApplicationAndroid 的类别更接近AppDelegateiOS。
Shivam Bhalla

谢谢,如果您能更好地回答我,请执行。阅读您的答案后,我将删除答案。
Siddharth

1

希望这会有所帮助...

刚接触这种语言的程序员总是有相同的问题-程序是否从主要方法开始?是的,在这种情况下您是对的;iOS应用程序也从一种主要方法开始。
您的主类调用以下函数:

 UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 

UIApplicationMain启动了Cocoa Touch运行循环和创建UIApplication对象的应用程序基础结构。我们的应用程序需要内容,因此Objective-C使用委托来处理此问题。因此,我们将其称为AppDelegate(充当的代表UIApplication)。我们实现了该委托的一些可选方法,并且它的行为也相应。


请有人可以让我理解以上答案中的错误

2
似乎很困惑,因为a)您没有使用正确的标点符号/拼写/语法,b)主题不正确,因为它并未真正回答原始张贴者提出的问题。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.