在 swift 中将 AppDelegate 类声明为“final”是不好的做法吗?
Posted
技术标签:
【中文标题】在 swift 中将 AppDelegate 类声明为“final”是不好的做法吗?【英文标题】:Is it bad practice to declare the AppDelegate class as 'final' in swift? 【发布时间】:2017-12-07 18:08:53 【问题描述】:现在,我正在尝试使用 Git 中的一个名为 Insomnia 的类来防止设备在充电时锁定。如果您好奇,project 就在这里。对于示例代码,它让我这样做:
final class AppDelegate: UIResponder, UIApplicationDelegate
private let insomnia = Insomnia(mode: .whenCharging)
//app delegate code
如您所见,它让您将AppDelegate
声明为final
,这样insomnia
变量就不会被释放,这会阻止它工作。但是,我不确定,将我的AppDelegate
声明为final
是不是这种不好的做法?或者这会导致我的应用出现问题吗?如果这是不好的做法,是否有更好的方法来确保 insomnia
不会被释放?
【问题讨论】:
那么是不是不需要声明为final
呢?
查看项目,它从未声称使用final
是为了防止insomnia
变量被释放。这似乎是你自己的结论,对吗?
这不是坏习惯……只是有点毫无意义。您只能让一个实例处于活动状态,并且它在您的应用程序的整个生命周期中都处于活动状态。
【参考方案1】:
你说:
如您所见,它让您将
AppDelegate
声明为final
,这样insomnia
变量就不会被释放...
final
不是这样做的。它只是说该类不能被子类化(这在应用程序委托的情况下可能永远不相关)。 final
关键字还允许一些优化(如果您有代码调用这些方法中的任何一个,它可以使用静态调度而不是动态调度)在这种情况下不太可能产生任何可观察到的效果。
底线,您不必在此上下文中使用final
。
“最佳实践”是在您需要的地方使用final
,即该类确实不能或不应该被子类化,或者您确实需要静态调度提供的性能差异。
在回答您的问题时,这是否是一个可以接受的声明 insomnia
的地方,是的(但不需要 final
)。 AppDelegate
不会在应用运行时发布,我们通常会在其中放置“应用生命周期”相关代码。
【讨论】:
以上是关于在 swift 中将 AppDelegate 类声明为“final”是不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章
Xcode & Swift - 无法从 AppDelegate 实例化另一个视图控制器
AppDelegate.swift 如何在 Xcode 6.3 中替换 AppDelegate.h 和 AppDelegate.m
Swift - 在 AppDelegate 中实例化视图控制器