1

これがクラッシュする関数です。コードの正確な行は、removeObjectForKey. テスト関数が完全に空の場合でも、removeObjectForKey でクラッシュします。注: 空の関数コールバックを渡しているだけです。現在、ARC をオフにしていますが、オンにする必要がありますか? 可能であれば、ARC をオフにして実行したいと考えています。ARC をオンにすると、多くのコンパイルの問題に対処することになるからです。

関数は保持されないオブジェクトについて何かを言うため、メモリの問題である可能性があります。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    // So we got some receipt data. Now does it all check out?
    BOOL isOk = [self doesTransactionInfoMatchReceipt:responseString];

    VerifyCompletionHandler completionHandler = _completionHandlers[[NSValue valueWithNonretainedObject:connection]];
    [_completionHandlers removeObjectForKey:[NSValue valueWithNonretainedObject:connection]];

    if (isOk)
    {
        //Validation suceeded. Unlock content here.
        NSLog(@"Validation successful");
        completionHandler(TRUE);

    } else {
        NSLog(@"Validation failed");
        completionHandler(FALSE);
    }
}

ここでは、verificationController の使用法を示します。

    [[VerificationController sharedInstance] verifyPurchase:transaction completionHandler:^(BOOL success) {
        if (success) {

            NSLog(@"Hi, its success.");
            [self testMethod];

       } else {
            NSLog(@"payment not authorized.");
        }
    }];         
}

- (void) testMethod {

}

__weak を使用できますが、回避しようとしている ARC をオンにする必要があります。注:verificaitionControllerは、他のクラス/オブジェクト内に配置すると機能しますが、InAppPurchaseManagerに配置するとすぐに、自己にアクセスしようとすると爆発します。Self は、次のように定義された InAppPurchaseManager のインスタンスを指します (phonegap プラグイン)。

@interface InAppPurchaseManager : CDVPlugin <SKPaymentTransactionObserver> {

}
4

4 に答える 4

0

次の文字列を検索します。

[_completionHandlers setObject:completionHandler forKey:[NSValue valueWithNonretainedObject:conn]];

そして、次のように変更します。

[_completionHandlers setObject:[completionHandler copy] forKey:[NSValue valueWithNonretainedObject:conn]];
于 2013-06-15T19:37:11.970 に答える
0

_completionHandlers は nil ですか? あなたはこのようなことをするかもしれません -

if (_completionHandlers && [_completionHandlers respondsToSelector:@selector(removeObjectForKey:)]) {
    [_completionHandlers removeObjectForKey:[NSValue valueWithNonretainedObject:connection]];
}

幸運を。

于 2013-05-09T20:37:26.853 に答える