iPhone模拟器启动应用时收到SIGKILL信号,但在Xcode中却没有。

4
好的,那么从新安装应用程序(在 iPhone 模拟器上没有先前安装的应用程序)开始,应用程序启动良好。然后我按下主页按钮并单击图标,也很好。然后,如果我按下主页按钮,然后从多任务栏中关闭应用程序,然后再次按下图标,我会收到 SIGKILL 错误。
但是,当我在 Xcode 中按下运行时,它总是无故障地工作(即使我已经从多任务栏中关闭它,而按下图标失败)。这只是模拟器的一个怪癖吗?这种行为仅在我实现了一些 NSUserDefaults 方面后才开始出现,以记住它的状态等等。它确实在正常工作时记住所有默认值。
任何帮助都将不胜感激。
编辑:
- (void)viewDidLoad
{

NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
                                 [NSNumber numberWithInt:1], @"firstRun",
                        nil];
[defaults registerDefaults:appDefaults];
if ([[defaults objectForKey:@"firstRun"] intValue] == 1) {
//do the stuff required at first launch
table = [NSMutableArray array];
Stocks =[NSMutableArray array];
Money =1234.56;
mem=@"GOOG";
[defaults setDouble:Money forKey:@"money"];
[defaults setObject:mem forKey:@"ticker"];
[defaults synchronize];
self.Input.text=mem;


- (void)viewWillAppear:(BOOL)animated
{

NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
if ([[defaults objectForKey:@"firstRun"] intValue] == 0) {
    [self entered:nil];

} else if ([[defaults objectForKey:@"firstRun"] intValue]== 1){
    [defaults setObject:[NSNumber numberWithInt:0] forKey:@"firstRun"];
    [defaults synchronize];
}
[super viewWillAppear:animated];
}

以下是我认为与我的 MainViewController 中的 NSUserDefaults 相关的信息(我不在任何其他 viewController 中使用 UserDefaults)。
我在其他几个方法中执行了一些 setObjects/synchronizes,但它们只在点击按钮时执行(当它崩溃时不会发生)。

就像我说的那样,这只会在第一次启动后发生。但是如果您在Xcode中按“运行”而不是按图标(通常会崩溃时),它就可以正常工作。它还会加载在第一次启动时设置的所有用户默认值,因此我不愿意认为这是我使用NSUserDefaults的方式有问题(因为如果是这样,我怀疑它从Xcode启动时也会崩溃)。如果有帮助的话,我可以上传我的项目。 - Greg Cawthorne
在原始帖子中添加了我的NSUserDefaults用法。 - Greg Cawthorne
啊啊啊啊......真狡猾。我没有在Xcode中按停止按钮。一旦我这样做,它就起作用了!这是否意味着我可以像往常一样继续进行,并且当它实际在iPhone上运行时,从多任务栏中关闭它会起到与在Xcode中按停止按钮相同的作用?还是有一些神秘的代码可以用来以编程方式解决这个问题? - Greg Cawthorne
@GregCawthorne 不,你应该先停止 Xcode,然后如果你愿意,可以关闭设备/模拟器上的应用程序。 - thvanarkel
1
@GregCawthorne:一旦您的应用程序安装在设备上并且未连接到Xcode进行运行/分析/测试,这种情况就不会发生。 - mvb
显示剩余7条评论
1个回答

3
当你将应用程序从多任务栏中删除时,实际上是永久关闭它。因此你摧毁了实例(所有进程被杀死),这是XCode与你的应用程序相关联的。这就是为什么你会得到SIGKILL错误。
有关iPhone模拟器的更多信息:http://developer.apple.com/library/ios/#DOCUMENTATION/Xcode/Conceptual/ios_development_workflow/25-Using_iOS_Simulator/ios_simulator_application.html 实际上,即使在实际设备上运行应用程序,并从多任务栏中删除它,当应用程序连接到Xcode时也会发生这种情况。然而,如果你的应用程序已安装在设备上并且未连接到Xcode进行运行/测试/分析,则不会出现此问题。

谢谢!我该如何在Xcode中模拟按下停止按钮,使用Objective-C语言?如果有这样的代码,我可以将其放在'applicationWillTerminate'方法中。 - Greg Cawthorne
@GregCawthorne:我认为这个问题或许可以解决你的疑问:https://dev59.com/EHA75IYBdhLWcg3wy8fr - mvb
此外,Xcode的停止按钮旨在停止模拟器/设备与Xcode之间的连接。尽管您可以为应用程序崩溃时的未知情况自定义applicationWillTerminate方法。 - mvb
谢谢。您能否在您的回答中加入“一旦您的应用程序安装在设备上并且未连接到Xcode进行运行/分析/测试,这种情况就不会发生。”我觉得这是解决我的问题的信息。 - Greg Cawthorne
2
@GregCawthorne 要模拟退出,只需在 C 中使用 exit(0) :) - user529758

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