0

わかった。私のアプリケーションで動作するアプリ内購入があります。アプリケーションのストアとして機能するViewControllerがあり、ユーザーはそこから物を購入できます。

初めて店に入るときは(好きなだけ)上手く買うことができますが、店を出てから戻ってみると気まぐれになります。場合によっては少し動作し続けることもありますが、常に「EXC_BAD_ACCESS」でクラッシュします。

支払いの追加行でクラッシュします。

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
SKMutablePayment *payment = [[SKMutablePayment alloc] init];
payment.productIdentifier = @"uk.co.exampleEmail_name.MaxBuys";
[[SKPaymentQueue defaultQueue] addPayment:payment];

ただし、main.mファイルの次の場所にある場合もあります。

int main(int argc, char *argv[])
{
@autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

別の同様の質問は、複数のトランザクションオブザーバーを追加する他のコードがあったためだと述べましたが、これは私がそれを呼び出す唯一の場所です。しかしもちろん、それは購入の試みごとに一度それを呼びます。ビューのproductsrquestデリゲートコマンドが読み込まれました。

どんな助けでもありがたいです。

4

1 に答える 1

4

エラーメッセージは、クラスであるInAppPurchaseManagerの割り当て解除されたインスタンスにメッセージが送信されていることを示します。そして、ビューを開いて(インスタンスを作成)、ビューを閉じて(インスタンスを解放して)、ビューを再び開いて(2番目のインスタンスを作成して)発生します。そして、問題はaddPayment:呼び出し内で発生しています。これは、フレームワークがまだ古いリリース済みインスタンスのハンドルを持っており、メッセージを送信しようとしていることを示しています。

呼び出すときに、フレームワークにloadStore内のオブジェクトへのハンドルを与えます

  [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

あなたがオブザーバーとして自分自身を取り除くところはどこにも見当たりません。通知を送信するオブジェクトは、通常、オブザーバーを保持しません。これを行うと、保持サイクルやメモリリークが発生する可能性があるためです。

あなたのdeallocコードでは、クリーンアップしてremoveTransactionObserverを呼び出す必要があります:。それはあなたの問題を解決するはずです。

- (void)dealloc {

    [[SKPaymentQueue defaultQueue]removeTransactionObserver:self];

    [super dealloc];
}
于 2013-06-14T11:01:20.970 に答える