Примечание:
Хотя на этот вопрос ответили как «невозможно», я думаю, что это правильный вопрос для нового разработчика iOS, и он может что-то сделать, что, вероятно,что они хотят.
Существует способ «перезапустить» ваше приложение с точки зрения пользователя, а это не технически перезапуск или выход из приложения iOS.Как указано в других ответах, приложение для iOS никогда не должно явно выходить, потому что это не разрешено в iOS.
Мой ответ:
Если вы хотите, чтобы ваше приложение вернулось назаддо состояния, в котором он находился при запуске, это не возможно на 100%, но я объясню способ получить большую часть пути, которого должно быть достаточно для всех действительных целей.
Первое, что нужно сделать, это повторно-создать свой корневой контроллер просмотра.Я рекомендую делать это с помощью метода в делегате приложения, например:
- (void)resetAppToFirstController
{
self.window.rootViewController = [[MyMainViewController alloc] initWithNibName:nil bundle:nil];
}
Во многих случаях этого будет достаточно, но любое состояние приложения, которое у вас есть, также должно быть сброшено в этом методе.Например, выйдите из системы, сбросьте любое непостоянное состояние и аннулируйте (освободите) все объекты, которые вы можете.Этот метод также можно использовать для первоначального создания первого контроллера представления из application:didFinishLaunchingWithOptions
.
Framework-классов и Singletons:
Вы не сможете полностью сброситьсостояние отдельных фреймворков или экземпляров фреймворка, таких как эти:
[UIApplication sharedApplication];
[NSNotificationCenter defaultCenter];
[NSUserDefaults standardUserDefaults];
[UIScreen screens];
// etc...
Это, вероятно, хорошо, так как в любом случае вам не следует хранить какое-либо непостоянное состояние (кроме NSNotificationCenter
, новсе зарегистрированные наблюдатели должны были быть удалены, когда объекты были освобождены).Если вы хотите инициализировать или сбросить любое состояние структуры, вы можете сделать это тем же методом resetAppToFirstController
.В любом случае, не нужно создавать их заново, или объект window
.
Если у вас есть какой-либо из ваших собственных синглетонов, вы можете воссоздать их, сохранив их в классе-одиночном держателе.(который сам по себе настоящий синглтон).Концептуально, это простой одноэлементный класс со свойствами для каждого из ваших других синглетонов и reset
метод для аннулирования и освобождения их всех.Ваши другие синглтоны должны использовать этот класс (вместо статической или глобальной переменной) для хранения экземпляров синглтона.Будьте осторожны, если вы используете какие-либо сторонние библиотеки, так как они могут также использовать синглтоны, и вам нужно будет убедиться, что они также используют ваш синглтон-держатель, чтобы вы могли сбросить их при необходимости.Я думаю, что эта техника в любом случае является хорошей практикой, потому что в некоторых случаях (например, модульное тестирование) вы хотите, чтобы объекты, которые обычно были одиночными, исчезали и повторно инициализировались в первоначальное состояние.Однако вы не хотите связывать одноэлементные реализации с вашим одноэлементным держателем, поэтому хорошим способом реализации этого является использование NSMutableDictionary
в качестве связанного объекта в [UIApplication sharedApplication]
с именами одноэлементных классов в качестве ключей.Однако я немного отклоняюсь от темы, поскольку это более продвинутый метод, выходящий за рамки этого вопроса.
Вышеприведенного должно быть достаточно, чтобы «перезагрузить» ваше приложение настолько, насколько это возможно пользователю.обеспокоен.Вы даже можете снова показать заставку, если хотите в качестве первого контроллера просмотра.