1

私は iOS 6 のアプリ購入に実装しようとして います。参照ポイントとして、Ray Wenderlich iOS 6 アプリ内チュートリアルに従っています。私が Ray のコードから行っている大きな変更の 1 つは、カスタム テーブル ビューを作成するのではなく、ユーザーがタップして購入する単一のボタン (アプリの購入には 1 つしかありません) があることです。私はそれを機能させることができないようで、私は取得し続けます

-[__NSMallocBlock__ allObjects]: unrecognized selector sent to instance 0x1d5846d0
2012-10-03 00:03:25.715 myapp[752:907] *** Terminating app due to uncaught exception   'NSInvalidArgumentException', reason: '-[__NSMallocBlock__ allObjects]: unrecognized selector sent to instance 0x1d5846d0'

問題が発生していると思います

- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler 

ray が実装したヘルパー クラスと私が実装したヘルパー クラスが 2 つあります。これらのために変更したのは、アプリの ID 番号だけです。これらのクラスは IAPHelper.h/m および RageIAPHelper.h/m と呼ばれます

エラーが発生していると思われるコードを投稿しました(長くはありません)。誰かが私を助けてくれれば、私はこれに約4時間取り組んでいます. 前もって感謝します

purchaseViewController の内部

 -(void) viewDidLoad
 {
 [super viewDidLoad];
 [self reload]; //Customized for my own needs compared to what Ray had
  }

-(void)reload {
_products = nil;
[[RageIAPHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *products) {
    if (success) {
        _products = products;
        //[self.tableView reloadData];
    }
    //[self.refreshControl endRefreshing];
 }];
}

IAPHelper.m という内部ヘルパー メソッド

- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler {

// 1
 _completionHandler = [completionHandler copy];
// 2
_productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers]; // This is where I think the crash is
_productsRequest.delegate = self;
[_productsRequest start];
}
4

2 に答える 2

4

問題が発生する場合

-(void)requestProdcutsWithCompletionHandler:(RequestProductsCompletionHandler)
    completionHandler{
    ....
{

最初の呼び出しが完了する前に2回呼び出されます。その理由は、SKProductsRequestDelegateが使用され、応答を受信すると次の関数を呼び出すためです。

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:
    (SKProductsResponse *)response{
    ...
    _completionHandler(YES, availableProducts)
    _completionHandler = nil;
}

応答が処理された後、_completionHandlerがnilに設定されていることに注意してください。さて、次の応答が「requestProductsWithCompletionHandler」への重複呼び出しから来るとき、_completionHandlerはnilであり、例外をスローします。この2つの方法を修正できます。その関数を複数回呼び出さないようにするか(悪い方法)、completionHandlerが使用されていないことを確認するロジックを配置します。

-(void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler{

NSLog(@"Request Products");
if (!_completionHandler) {
    NSLog(@"CompletionHandler called, new one was made");
    _completionHandler = [completionHandler copy];

    NSMutableSet * productIdentifiers = [NSMutableSet setWithCapacity:_products.count];
        for (IAPProduct * product in _products.allValues) {
            product.availableForPurchase = NO;
            [productIdentifiers addObject:product.productIdentifier];
        }

    _productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
    _productsRequest.delegate=self;
    [_productsRequest start];
}else{
    NSLog(@"Duplicate call!");
}
}

productRequestは、最初に_completionHanlderがnilであることを確認し、そうでない場合は、ハンドラーが使用されているため、要求を無視します。

于 2012-12-18T03:48:14.843 に答える