1

開発中のアプリケーションは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);
}

誰かがこれの手がかりを持っていますか?本当に...失われました!

前もって感謝します

4

2 に答える 2

2

これがクラッシュの原因であるかどうかはわかりませんが、ここで問題が発生します。

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

基本的に、セレクター呼び出しに2つあるという事実は、:2つの引数を予期していることを意味します。メソッドを使用する場合は、performSelector:withObject:afterDelay:引数が1つあるメソッドでのみ使用できます。

例えば、

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

と同等です

[self doSomething:object]

約20秒後に実行されます。

この場合、2つの@selector引数を取るために不一致があり、その特定のメソッドで使用することはできません。performSelector

2つの引数を取るメソッドがありperformSelector:withObject:withObjectますが、引数はありませんdelayNSInvocation代わりに使用するかattackTo:attacker:、単一の引数(たとえば、NSDictionary)を使用するようにを変更する必要がある場合があります。

于 2012-11-22T01:25:26.310 に答える
0

CountDownTimerというクラスを使用しているようです。これはNSTimerのサブクラスですか?その場合は、NSTimerクラスリファレンスのサブクラス化に関する注意事項をお読みください。 NSTimerクラスリファレンス

基本的に、それはそれをしないと言います。実は基本的にもそうじゃない、やらないと書いてあります。

クラスリファレンスを読んでいる間、n秒後にコールバックを実装する方法を見てください。個人的には好きです+ scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:

于 2012-11-22T01:15:31.367 に答える