0

私は cocos2d を初めて使用するので、アプリ内購入クラス ヘルパーに問題があります。私は Cocoa Touch でゲームを書きましたが、このクラスは完全に機能していますが、現在 Cocos2d で同じゲームを書いており、NSString に問題があります。

ここにいくつかのスニペットがあります。

このメソッドは、ボタンをクリックしたときに最初に呼び出されます。ご覧のとおり、いくつかの文字列パラメーターcompleteIdentifierを持つ単純な文字列です。bundleIdentifier大丈夫です、この場所でこれをログに記録できますcompleteIdentifier

- (void)prepareToPurchaseItemWithIdentifier:(NSString *)aIdentifier showAlertWithTitle:(NSString *)title description:(NSString *)description delegate:(id)aDelegate{

    self.delegate = aDelegate;

    identifier = aIdentifier;
    completeIdentifier = [NSString stringWithFormat:@"%@.%@", [[NSBundle mainBundle] bundleIdentifier], aIdentifier];

    askToPurchase = [[UIAlertView alloc] initWithTitle:title message:description delegate:self cancelButtonTitle:nil otherButtonTitles:@"Later", @"Yes", nil];
    askToPurchase.delegate = self;
    [askToPurchase show];
}

次のメソッドはUIAlertViewDelegateメソッドです。最初のメソッドをクリックYESすると呼び出されます。alertView

#pragma mark - UIAlertViewDelegate Methods
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSLog(@"%@", completeIdentifier);
    if (alertView == askToPurchase) {

        NSLog(@"[TSIAPHelper] Clicked YES. Prepare...");
        if ([SKPaymentQueue canMakePayments]) {

            NSLog(@"[TSIAPHelper] Prepare to purchase [%@].",completeIdentifier);
            SKProductsRequest *request =[[SKProductsRequest alloc] initWithProductIdentifiers:
                                     [NSSet setWithObject:completeIdentifier]];
            request.delegate = self;
            [request start];

            pleaseWait = [[UIAlertView alloc] initWithTitle:@"Please wait..." message:@"" delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
            UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
            [activity startAnimating];
            [pleaseWait addSubview:activity];
            activity.frame = CGRectMake(125, 50, 36, 36);
            [pleaseWait show];
        }
        else {

            NSLog(@"[TSIAPHelper] Purchase [FAILURE]. Prohibited by Parentar Control or something like that.");
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Prohibited." message:@"Parental Control is enabled, cannot make a purchase. Turn off and try again." delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok", nil];
            [alert show];
        }
    }
}

問題は次のとおりです。変数をログに記録したいときはいつでもどこでもcompleteIdentifier、選択した行でクラッシュしました。0x39e965d0: ldr r3, [r4, #8]しかし、それが何を意味するのかわかりません。そして、この行が選択されています:

NSLog(@"%@", completeIdentifier);

どうすれば修正できますか?In Cocoa Touch は完璧に機能しています。私がcocos2dを使用するときはそうではありません。

4

1 に答える 1

1

ARCを使用していないと思います。この場合、completeIdentifier は自動解放されます。

Cocos2d はフレームごとに autoreleasepool をクリアしますが、Cocoa ではこれは厳密に定義されていませんが、それでもクラッシュする可能性があります。これは、文字列を保持またはコピーすることで修正できます。

completeIdentifier = [NSString stringWithFormat:@"%@.%@", [[NSBundle mainBundle] bundleIdentifier], aIdentifier];
completeIdenfitier = [completeIdentifier retain];
于 2013-01-03T00:39:00.463 に答える