应用程序在iPhone设备上意外终止,但在Simulator上运行正常

时间:2012-11-22 01:08:28

标签: iphone ios xcode

开发在Xcode模拟器上正常运行的应用程序,但是当我在真实设备上测试它时终止。以下是我的手机控制台在应用程序终止时打印出来的内容。

Nov 22 00:51:09 iPhone ReportCrash[3862] <Notice>: Formulating crash report for process CoL[3860]
��Nov 22 00:51:09 iPhone ReportCrash[3862] <Error>: libMobileGestalt copySystemVersionDictionaryValue: Could not lookup ReleaseType from system version dictionary
��Nov 22 00:51:09 iPhone com.apple.launchd[1] (UIKitApplication:pan.ConquestOfLancaster[0xd857][3860]) <Warning>: (UIKitApplication:pan.ConquestOfLancaster[0xd857]) Job appears to have crashed: Segmentation fault: 11
��Nov 22 00:51:09 iPhone backboardd[52] <Warning>: Application 'UIKitApplication:pan.ConquestOfLancaster[0xd857]' exited abnormally with signal 11: Segmentation fault: 11
��Nov 22 00:51:09 iPhone ReportCrash[3862] <Notice>: Saved crashreport to /var/mobile/Library/Logs/CrashReporter/CoL_2012-11-22-005109_iPhone.plist using uid: 0 gid: 0, synthetic_euid: 501 egid: 0
��Nov 22 00:51:09 iPhone awdd[3863] <Error>: libMobileGestalt copySystemVersionDictionaryValue: Could not lookup ReleaseType from system version dictionary

基本上,当我触发NSTimer(倒计时)并达到'1'时会出现问题。冻结一段时间然后终止。

这是定时器初始化的方法:

- (void)MapMenu:(MapMenu *)menu didSelectButton:(NSInteger)index{

    if (index == 0) {
        if (self.owner == nil && distance < 10) {
            CountDownTimer* countDown = [[CountDownTimer alloc]init];
            [countDown startTimerOn:parentView];
            [self performSelector:@selector(attackTo:attacker:) withObject:nil afterDelay:20.0];
        }
        else if (self.owner == @"Player_1")
            NSLog(@"You have already occupy this building with name, %@", self.title);
    }
}

- (void) attackTo: (BuildingViewController*) selectedBuilding attacker: (NSString*) attacker{

    self.owner = @"Player_1";
    NSLog(@"Building has a new owner with name, %@", self.owner);
}

有没有人对此有所了解。真的......迷路了!

提前致谢

2 个答案:

答案 0 :(得分:2)

我不确定这是否是崩溃的来源,但你确实遇到了问题:

[self performSelector:@selector(attackTo:attacker:) withObject:nil afterDelay:20.0];

基本上,选择器调用有两个:的事实意味着它期待两个参数。如果使用方法performSelector:withObject:afterDelay:,则只能将其与具有一个参数的方法一起使用。

例如,

[self performSelector:@selector(doSomething:) withObject:object afterDelay:20.0f]

相当于

[self doSomething:object]

将在约20秒后执行。

在这种情况下,由于您的@selector带有两个参数,因此您不匹配,因此您无法将其与特定的performSelector方法一起使用。

虽然有performSelector:withObject:withObject方法接受两个参数,但它没有delay参数。您可能需要使用NSInvocation,或更改attackTo:attacker:以便它使用单个参数(例如,NSDictionary)。

答案 1 :(得分:0)

我看到你使用了一个名为CountDownTimer的类。这是NSTimer的子类吗?如果是这样,您应该阅读NSTimer类引用中的子类注释。 NSTimer Class Reference

基本上,它说不要这样做。实际上甚至没有基本上,它说不要这样做。

在阅读类引用时,请查看如何在n秒后实现回调。就个人而言,我喜欢+ scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: