什么是AppDelegate以及如何知道何时使用它?

时间:2009-03-16 23:00:55

标签: ios objective-c cocoa-touch

我刚开始研究iPhone应用程序。我怎么知道什么时候应该把东西放在AppDelegate而不是自定义类?是否有一种规则或任何类型的类比与使用类似AppDelegate的模式的其他编程语言(如Python或PHP)?

4 个答案:

答案 0 :(得分:237)

我通常会避免安德鲁使用术语“应用程序的核心”所暗示的设计方法。我的意思是,我认为你应该避免在中心位置混淆太多东西 - 良好的程序设计通常涉及将功能分离为“关注领域”。

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

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

  • applicationDidFinishLaunching: - 适合处理启动时的配置和构造
  • applicationWillTerminate: - 最后清理

你应该避免在AppDelegate中加入其他功能,因为它们并不真正属于那里。这样的其他功能包括:

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

很多人将这些东西归咎于他们的AppDelegate因为他们很懒或者他们认为AppDelegate控制着整个程序。您应该避免集中在您的AppDelegate中,因为它会混淆应用程序中的关注区域并且无法扩展。

答案 1 :(得分:24)

您的申请代表是您申请的核心。它实际上是你的“程序控制器”。

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

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

答案 2 :(得分:2)

@Shivam,谢谢。

根据我对appDelegate的理解,与Application在Android中的内容非常接近。 viewDidLoadviewDidDisappear可与Android的生命周期相媲美。每个应用程序都有一个生命周期,从启动到中断呼叫,到显示通知。如果您需要代码在发生这些system事件时执行某些特殊操作,那么您需要编写方法代码。

在Android中,我们使用onPauseonDestroyonCreate类型的回调方法来处理此类系统事件。

答案 3 :(得分:1)

希望这会有所帮助...

对这种语言不熟悉的程序员总是有同样的问题 - 程序是从主方法开始的吗?是的,在这种情况下你是对的; IOS应用程序也从主方法开始。
您的主类调用以下函数:

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

UIApplicationMain启动Cocoa Touch运行循环和应用程序基础架构,创建UIApplication对象。我们的应用程序需要内容,所以objective-c使用委托来处理这个问题。这就是我们称之为AppDelegate(充当UIApplication的代表)的原因。我们实现了该委托的一些可选方法,并且它的行为相应。