3

ゲーム内のショップビューとビューコントローラーを使用してゲームを作成しました。ショップには、メニュー(ViewController.m)およびゲームオーバー画面(GameViewController.m)からアクセスできます。

私の問題は、メニューに一度ショップを表示してから、ゲームをプレイし、ゲームオーバー画面でショップにアクセスして何かを購入しようとすると、アプリがクラッシュして、多くの情報がない状態でEXC_BAD_ACCESSエラーが発生することです。(で壊す

[[SKPaymentQueue defaultQueue] addPayment:lPayment];

IAPを購入しようとしたときに、ShopViewControllerのButtonPressedアクションの行。

私の見解は次のように設定されています。

メニュービュー->ラダービュー->ゲームビュー->ショップビュー

メニュービュー->ショップビュー

エラーを特定するのを手伝っていただければ幸いです。

編集 - - - - - -

ゲームビューを使わなくても、メニュー→ショップビューからエラーを再現できるようです。これを行うには、「購入ボタン」を押し、キャンセルを押し、メニューに戻り、ショップに戻って、繰り返します。3〜4回目の試行で、同じ行でクラッシュします。ボタンを押す方法全体を次に示します。

- (void)buyButtonPressed:(UIButton *)pButton {
    NSInteger lTag = [pButton tag];
    //////NSLog(@"Button tag: %i"), lTag;

    Reachability *lReachability = [Reachability reachabilityForInternetConnection];
    NetworkStatus lCurrentNetworkStatus = [lReachability currentReachabilityStatus];
    if (lCurrentNetworkStatus != NotReachable) {
        if ([SKPaymentQueue canMakePayments]) {
            SKPayment *lPayment = [SKPayment paymentWithProduct:[mPriceArray objectAtIndex:lTag]];
            [[SKPaymentQueue defaultQueue] addPayment:lPayment];
            [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

        } else {
            [self showAlertViewWithText:@"Purchases are disabled. Please check your settings for General -> Restrictions -> In-App Purchases and try again." andTitle:@"Warning"];
        }
    } else {
        [self showAlertViewWithText:@"No network connection!" andTitle:@"Warning"];
    }
}

したがって、lPaymentの割り当てが解除されているように見える場合があります。私も設定しようとしました

mProductIds = nil;
mPriceArray = nil;

ショップビューを削除したときに、ショップをリロードするときに強制的に再度割り当てようとしましたが、運がありませんでした。

ありがとう

4

3 に答える 3

1

最初にNSZombieを有効にして、問題を追跡してみてください。EXC_BAD_Access問題の場合、問題がどこにあるかを単純に推測するよりも、割り当て解除されたオブジェクトをトレースする方が、いつかit(NSZombie)の方が便利になります。

于 2013-01-29T11:21:03.220 に答える
1

提供された情報から判断するのは難しいですが、次の可能性があります。

SKPayment *lPayment = [SKPayment paymentWithProduct:[mPriceArray objectAtIndex:lTag]];  

SKPayment オブジェクトをインスタンス化し、それを現在の自動解放プールに渡します。このプールが存在しない場合 (これは、自動解放プールが明示的に設定されていない別のスレッドでコードが実行される場合に当てはまります)、オブジェクトはすぐに再び解放され、ステートメント

[[SKPaymentQueue defaultQueue] addPayment:lPayment];  

無効なメモリにアクセスします。

于 2013-01-30T19:14:31.603 に答える