5

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

那是因为当我们创建一个新UIView控件时,我们是子类UIView更新:或者我们UIViewController也是子类)。那么为什么对于应用程序的情况,我们不子类化UIApplication而是使用委托呢?

4

6 回答 6

6

同样,从文档中:

子类化注释

您可能决定继承 UIApplication 以覆盖 sendEvent: 或 sendAction:to:from:forEvent: 以实现自定义事件和动作调度。然而,很少有必要扩展这个类;应用程序委托(UIApplicationDelegate 在大多数情况下就足够了。如果您将 UIApplication 子类化,请非常确定您要通过子类完成什么。

于 2012-05-26T05:12:42.093 回答
2

开发人员通常不这样做的原因是因为没有必要。UIApplication 在大多数情况下都可以正常工作。它只需要一些关于在某些预定义情况下做什么的提示(这就是它有一个委托的原因)。另一方面,UIView 非常通用,我认为它从来没有按原样使用过。它可能是整个 iOS 世界中自定义程度最高的类。

于 2012-05-26T05:05:52.830 回答
2

委托是一种核心设计模式。它允许在程序的各个部分之间分离职责。这个想法是,例如,绘制到屏幕上的程序部分可能不应该与您的数据库对话。有几个原因:

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

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

灵活性:如果您在代码中进行子类化,那就太好了——直到您开始遇到具有各种不良行为的单体类。您将达到必须重载行为以关闭事物的地步,并且您的属性命名空间可能会被污染。尝试类别、委派和块以寻找替代方案。

也就是说,我确实遇到了适合子类化的情况。我有一个自助服务终端应用程序,如果一段时间内没有与之交互,我想在其中自动关闭某个设置菜单。为此,我必须能够访问整个应用程序中的触摸事件。我继承UIApplication并覆盖了sendEvent:. 那是合适的,尽管这是一个边缘案例。正如所罗门王在传道书中所说的那样,意译:太阳底下的一切都有时间和地点。

为了更容易编写、阅读、迭代和维护您的程序,强烈建议您遵循某些做法。欢迎您对许多类进行子类化,Apple 不会因为您的应用程序代码不佳而拒绝您的应用程序,只要它按照宣传的方式运行即可。也就是说,如果你不遵守经过实践检验的具体做法,你就是在自掘坟墓。子类化本质上并不坏,但类别、协议和块是如此迷人,我还是更喜欢它们。

于 2013-05-07T13:35:54.717 回答
2

UIApplication 类参考:

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

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

那么你所说的“为什么我们不继承 UIApplication 是什么意思?Apple 甚至提供了关于在子类中实现什么的注释。

至于您关于仅在标准类上使用委托和单例的问题,答案很简单:应用程序必须提供一种通用的方式来接收和分派事件(外部和系统相关)、处理多任务以及与系统松散地接口(即为什么 main.m 包含对您的应用程序委托的引用)。

于 2012-05-26T05:00:07.310 回答
1

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

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

UIApplication 概述中的注释解释了您可能继承 UIApplication 的一个原因:

您可能决定继承 UIApplication 以覆盖 sendEvent: 或 sendAction:to:from:forEvent: 以实现自定义事件和动作调度。然而,很少有必要扩展这个类;应用程序委托(UIApplicationDelegate 在大多数情况下就足够了。如果您将 UIApplication 子类化,请非常确定您要通过子类完成什么。

但这应该只在非常特殊的情况下才有必要。

于 2012-05-26T05:10:42.780 回答
0

我将添加一些其他人没有提到的内容:当通过委托方法实现而不是具有重写方法的子类来覆盖/增强/添加行为时,委托消除了调用 super 的需要。我见过许多开发人员回答他们自己的 Stackoverflow 问题时只是忘记了调用 super(在有些人甚至发布了可能的答案之后)。较新的方法装饰器NS_REQUIRES_SUPER通过向开发人员发出警告(希望他们不要忽略它!)对此有所帮助,但是当调用 super 的顺序很重要时,它并没有帮助。我认为 Apple 决定让开发人员实现一个委托对象不太容易出错,它没有调用超级要求,他们甚至还做了将 UIResponder 方法从 UIApplication 转发到委托对象的艰苦工作。

于 2019-11-27T12:52:25.907 回答