在 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

在 AppDelegate (Swift) 中切换视图

Swift - 在 AppDelegate 中实例化视图控制器

如何在 OSX 应用程序中将 CoreData 管理与 AppDelegate 分离

swift 在AppDelegate.swift中不需要`@UIApplicationMain`