iPhone应用在模拟器4.0上运行时收到了Sigkill信号。

8
我刚拿到了iPhone SDK 4,并尝试离开之前正在开发的应用程序。因此,我实现了两个方法:-(void)applicationDidEnterBackground:(UIApplication *)application- (void)applicationWillTerminate:(UIApplication *)application
当我在模拟器4.0中点击home按钮时,似乎一切正常。应用程序调用-(void)applicationDidEnterBackground:(UIApplication *)application并进入后台状态。
然而,当我双击home按钮以暴露在后台运行的应用程序,并按住它以显示减号或退出时,单击减号时,调试器会显示:

Program received signal: "SIGKILL"

此外,- (void)applicationWillTerminate:(UIApplication *)application从未被调用。我是否需要做些什么才能使其在OS4上正常工作?或者至少有人可以指点我如何调试SIGKILL吗?谢谢。
2个回答

13

-applicationWillTerminate: 只有在你的应用程序在被要求退出时处于运行状态时才会被调用。如果它已经处于挂起状态(就像你在这里所描述的那样),系统会简单地向应用程序发送一个结束信号。当用户手动按下红色减号按钮终止应用程序以及系统决定抛弃应用程序以释放前台应用程序的内存时,就会发生这种情况。

如果你的应用程序在后台运行(例如播放音乐或运行某些后台任务)并且用户通过按下减号按钮手动终止了应用程序,那么你才会实际上收到 -applicationWillTerminate: 消息。因此,在从 -applicationDidEnterBackground: 中返回之前,你必须保存所有状态等信息。


谢谢回复。那很有道理。然而,我还有另一个问题。当-applicationDidEnterBackground:被调用时,我尝试使用NSUserDefaults保存应用程序的状态,但由于某种原因,一旦应用程序重新启动,我的值并不是我期望的值。有什么原因导致这在OS4中无法工作吗? - NickDK

2
这是可以预料的,多任务栏上的“红色关闭按钮”相当于在Mac OS X上强制退出应用程序。这是有记录的行为。苹果公司希望iOS 4的普通用户只需启动/使用/解除应用程序,无需考虑终止进程或其他事项。系统将管理这些操作。
请确保在application:willResignActive:或applicationWillEnterBackground中保存任何重要数据。因为在那之后,当内存压力迫使系统进行清理时,您的应用程序可能会被关闭。Snow Leopard针对使用其Info.plist中的NSSupportsSuddenTermination密钥的应用程序引入了类似的行为方式。一个应用程序基本上告诉系统,它周期性地逐位保存其数据,以便在后台运行时没有什么需要做的或者只有很少的事情需要做。与大型单块桌面应用程序不同...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接