Note:
尽管这已被回答为“不可能”,但我认为对于新的 iOS 开发人员来说这是一个有效的问题,并且他们可以做一些事情,这可能就是他们想要的。
有一种方法可以从用户的角度“重新启动”您的应用程序,但这种方法不是技术上重新启动或退出 iOS 应用程序。正如其他答案所指出的,iOS 应用程序永远不应该显式退出,因为 iOS 上不允许这样做。
我的答案:
如果您希望您的应用程序返回到启动时的状态,这不是 100% 可能的,但我将解释一种方法,让您的应用程序能够充分满足所有有效目的。
要做的第一件事是重新创建根视图控制器。我建议通过应用程序委托中的方法执行此操作,如下所示:
- (void)resetAppToFirstController
{
self.window.rootViewController = [[MyMainViewController alloc] initWithNibName:nil bundle:nil];
}
在许多情况下,这已经足够了,但是您拥有的任何应用程序状态也应该在此方法中重置。例如,注销用户、重置任何非持久状态以及尽可能取消(释放)所有对象。此方法也可用于最初创建您的第一个视图控制器application:didFinishLaunchingWithOptions
.
框架类和单例:
您将无法完全重置任何框架单例或每个应用程序实例的状态,例如:
[UIApplication sharedApplication];
[NSNotificationCenter defaultCenter];
[NSUserDefaults standardUserDefaults];
[UIScreen screens];
// etc...
这可能没问题,因为无论如何你都不应该在其中存储任何非持久状态(除了NSNotificationCenter
,但是当对象被释放时,所有注册的观察者都应该被删除)。如果您确实想初始化或重置任何框架状态,您可以在相同的resetAppToFirstController
方法。无论如何,应该没有必要重新创建这些,或者window
object.
如果您有任何自己的单例,则可以通过将它们存储在单例持有者类(它本身就是真正的单例)中来重新创建它们。从概念上讲,这是一个简单的单例类,具有每个其他单例的属性和一个reset
方法将它们全部无效并释放。您的其他单例应该使用此类(而不是静态或全局变量)来存储单例实例。如果您使用任何第三方库,请务必小心,因为它们也可能使用单例,您需要确保它们也使用您的单例持有者,以便您可以根据需要重置它们。我认为这种技术无论如何都是很好的实践,因为在某些情况下(例如单元测试),您确实希望通常是单例的对象消失并重新初始化为原始状态。但是,您不想将单例实现与单例持有者结合起来,因此实现此目的的一个好方法是使用NSMutableDictionary
作为关联对象[UIApplication sharedApplication]
以单例类名作为键。然而,我有点偏离主题,因为这是超出这个问题范围的更先进的技术。
就用户而言,上述内容应该足以“重置”您的应用程序。如果您想作为第一个视图控制器,您甚至可以再次显示启动屏幕。