我正在编写一个iPhone应用程序,并且需要由于某些用户操作强制退出它。在清理了应用程序分配的内存后,调用哪种适当的方法来终止应用程序?
答案:在清理了应用程序分配的内存之后,可以使用exit(0)方法来终止应用程序。
我正在编写一个iPhone应用程序,并且需要由于某些用户操作强制退出它。在清理了应用程序分配的内存后,调用哪种适当的方法来终止应用程序?
答案:在清理了应用程序分配的内存之后,可以使用exit(0)方法来终止应用程序。
苹果公司表示:
"警告:不要调用exit函数。调用exit的应用程序将显示为已崩溃,而不是执行优雅终止并动画返回主屏幕。"
我认为这是一个错误的假设。如果用户点击退出按钮,并出现一条消息,如“应用程序现在将退出”,它不会显得崩溃。苹果应该提供一种有效的退出应用程序的方式(不是exit(0))。
不应直接调用函数exit(0)
,因为它会立即退出应用程序并看起来像是您的应用程序已崩溃。最好显示一个确认提示框,让用户自己执行此操作。
func askForQuit(_ completion:@escaping (_ canQuit: Bool) -> Void) {
let alert = UIAlertController(title: "Confirmation!", message: "Do you want to quit the application", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: { (action) in
alert.dismiss(animated: true, completion: nil)
completion(true)
}))
alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.cancel, handler: { (action) in
alert.dismiss(animated: true, completion: nil)
completion(false)
}))
self.present(alert, animated: true, completion: nil)
}
/// Will quit the application with animation
func quit() {
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
/// Sleep for a while to let the app goes in background
sleep(2)
exit(0)
}
self.askForQuit { (canQuit) in
if canQuit {
self.quit()
}
}
exit(0)
,abort()
函数退出应用是不被苹果鼓励的,虽然在开发和测试过程中可以使用这些函数。
请查看此 Apple Q&A 链接获取更多信息。如果在开发或测试期间需要终止您的应用程序,则建议使用 abort 函数或 assert 宏。
iOS 应用程序从不显示“关闭”或“退出”选项。人们在切换到另一个应用程序、返回主屏幕或将设备置于睡眠模式时停止使用应用程序。
永远不要以编程方式退出 iOS 应用程序。人们往往将其解释为崩溃。如果某些情况阻止您的应用程序按预期工作,您需要告知用户有关该情况并解释他们可以采取什么措施。
如果你的应用程序需要互联网连接,那么你可能需要退出应用程序。你可以显示一个警报,然后执行以下操作:
if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
[[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
kill(getpid(), SIGINT);
}
除了上面提到的好回答外,我想补充一点,考虑清理你的内存。
当你的应用程序退出时,iPhone操作系统会自动清理应用程序留下的任何内容,因此手动释放所有内存只会增加应用程序退出所需的时间。
- (IBAction)logOutButton:(id)sender
{
//show confirmation message to user
CustomAlert* alert = [[CustomAlert alloc] initWithTitle:@"Confirmation" message:@"Do you want to exit?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
alert.style = AlertStyleWhite;
[alert setFontName:@"Helvetica" fontColor:[UIColor blackColor] fontShadowColor:[UIColor clearColor]];
[alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex != 0) // 0 == the cancel button
{
//home button press programmatically
UIApplication *app = [UIApplication sharedApplication];
[app performSelector:@selector(suspend)];
//wait 2 seconds while app is going background
[NSThread sleepForTimeInterval:2.0];
//exit app when app is in background
NSLog(@"exit(0)");
exit(0);
}
}
[[UIApplication sharedApplication] terminateWithSuccess];
它运行良好并自动调用
- (void)applicationWillTerminateUIApplication *)application delegate.
为消除编译时警告,请添加此代码
@interface UIApplication(MyExtras)
- (void)terminateWithSuccess;
@end
如果一个应用程序是长期运行的,并且还在后台执行,例如使用“位置更新”背景功能来获取位置更新,则退出应用程序可能是合适的。
例如,假设用户从您的基于位置的应用程序注销并使用主页按钮将应用程序推到后台。在这种情况下,您的应用程序可能仍在运行,但完全退出它可能是有意义的。这对用户有好处(释放不需要使用的内存和其他资源),对应用程序的稳定性也有好处(即确保在可能时定期重新启动应用程序是防止内存泄漏和其他低内存问题的安全网)。
这可以通过类似以下内容的方式实现(尽管可能不应该,请参见下文 :-):
- (void)applicationDidEnterBackground:(UIApplication *)application
{
if (/* logged out */) {
exit(0);
} else {
// normal handling.
}
}
由于应用程序将退出后台,因此对用户来说看起来不会出错,也不会像崩溃一样,只要下次运行应用程序时恢复用户界面即可。换句话说,当应用程序在后台运行时,对用户来说,它看起来与系统启动的终止应用程序没有任何区别。
尽管如此,最好使用更标准的方法让系统知道可以终止应用程序。例如,在这种情况下,通过确保GPS未被使用来停止请求位置更新,包括关闭地图视图上的显示当前位置。这样,系统将在应用程序进入后台后几分钟(即[[UIApplication sharedApplication] backgroundTimeRemaining]
)自动终止应用程序。这将获得所有相同的好处,而无需使用代码终止应用程序。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
if (/* logged out */) {
// stop requesting location updates if not already done so
// tidy up as app will soon be terminated (run a background task using beginBackgroundTaskWithExpirationHandler if needed).
} else {
// normal handling.
}
}
exit(0)
是不合适的,这与其他参考http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html的答案相符。