为什么不分类UIApplication? 为什么要使用委托?

而不是使用应用程序委托,以便UIApplication单例可以在预定义的时间调用委托方法,只是UIApplication什么优点和缺点? ( 更新:为什么iOS架构使用应用程序委托,而不是让人们通过UIApplication并重写其各种方法来编写应用程序?)

这是因为当我们创build一个新的UIView控件时,我们UIViewupdate:或者我们也是UIViewController子类)。 那么为什么在应用的情况下,我们不UIApplication子类,而是使用委托?

再次,从文档:

子类化笔记

您可能决定将UIApplication的子类重写为sendEvent:或sendAction:to:from:forEvent:来实现自定义事件和动作分派。 但是,很less有必要扩大这个class级。 应用程序委托(UIApplicationDelegate对于大多数场合已经足够了,如果你做了UIApplication的子类,那么要确信你正在试图用这个子类来完成什么。

从UIApplication类参考:

UIApplication类为iOS上运行的应用程序提供了一个集中的控制和协调点。

每个应用程序必须只有一个UIApplication实例(或UIApplication的一个子类)。 当一个应用程序启动时,UIApplicationMain函数被调用; 在其他任务中,这个函数创build一个单例UIApplication对象。 此后,您可以通过调用sharedApplication类方法来访问此对象。

那么,你为什么不说我们为什么不分类UIApplication呢?苹果甚至提供了在子类中实现什么的注释。

至于你关于委托和单例使用超过标准类的问题,答案很简单:一个应用程序必须提供一个通用的方式来接收和分派事件(包括外部和系统相关的),处理多任务,并与系统松散地连接(这是为什么main.m包含对应用程序委托的引用)。

开发者通常不这样做的原因是因为没有必要。 UIApplication适用于大多数情况。 它只是需要在某些预定义的情况下做什么(这就是为什么它有一个委托)的提示。 另一方面,UIView是非常通用的,我不认为它是现在被使用的。 它可能是所有iOS世界中最为自定义的类。

授权是一个核心devise模式。 它允许在你的程序的各个部分之间分离责任。 这个想法是,你的程序的一部分,例如,绘制到屏幕上,可能不应该与你的数据库交谈。 有几个原因:

性能:如果绘制到屏幕的相同对象访问您的数据存储,则会遇到性能问题。 期。 句号

代码维护:对正确模块化的代码进行概念化更容易。 (对我来说,无论如何)

灵活性:如果你在你的代码中进行子类化,那就太好了,直到你开始运行一些单片类,这些类有各种不需要的行为。 您将达到您必须重载行为才能closures的地步,并且您的属性名称空间可能会被污染。 尝试类别,授权和块的替代品。

也就是说,我的确遇到了分类合适的情况。 我有一个自助服务terminal应用程序,如果它在一段时间内没有互动,我想要自动closures某个设置菜单。 为此,我必须在整个应用程序中访问触摸事件。 我分类UIApplicationsendEvent: 这是适当的,虽然这是一个边缘情况。 正如所罗门王在传道书中所说的那样:在阳光下有一个时间和地点。

为了方便编写,读取,迭代和维护您的程序,强烈build议您遵循某些实践。 欢迎您inheritance许多类,并且苹果公司不会拒绝您的应用程序的糟糕的代码,只要它按照广告运行。 也就是说,如果你不遵守具体的尝试和真实的做法,你正在挖掘自己的坟墓。 子类化本质上并不坏,但类别,协议和块是如此迷人,我宁愿他们无论如何。

UIView子类可能需要做许多专门的事情。 想想UIScrollView,UIImageView,UIWebView等,以及它们的内部运作必须有多么不同。 但是,它们仍然必须参与视图层次结构,因此子类化是有意义的。

另一方面,UIApplication是应用程序范围的事件,通知,开放URL,访问窗口和其他通用事物的中心枢纽。 在正常情况下,应用程序应该只需要知道UIApplicationDelegate协议将提供的东西。

来自UIApplication Overview的说明解释了您可能inheritanceUIApplication的一个原因:

您可能决定将UIApplication的子类重写为sendEvent:或sendAction:to:from:forEvent:来实现自定义事件和动作分派。 但是,很less有必要扩大这个class级。 应用程序委托(UIApplicationDelegate对于大多数场合已经足够了,如果你做了UIApplication的子类,那么要确信你正在试图用这个子类来完成什么。

但是,这只在非常特殊的情况下才是必要的。