在UIViews之间切换时,SKPaymentQueue Dealloc问题

时间:2013-03-05 14:09:43

标签: ios

我在应用购买代码中有以下内容。

- (IBAction)purchaseProduct:(id)sender
{
    SKProduct *thisProduct = [productDetailsList objectAtIndex:[sender tag]];

    if ([thisProduct.productIdentifier isEqualToString:@"demo"]) {
        SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"demo"];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    }
}

购买屏幕是由导航控制器控制的单独uiview。我第一次加载屏幕并进行购买都很好。但是,如果我加载屏幕,请离开然后返回并购买我收到以下错误:

*** -[FilterPurchase respondsToSelector:]: message sent to deallocated instance 0x1fd92ca0

在执行断点检查后,错误似乎发生在这一行左右:

[[SKPaymentQueue defaultQueue] addPayment:payment];

有人能在这看到这个问题吗?我正在使用ARC,所以我不确定如何解决这个问题。

由于

UPDATE

如果我也点击“恢复”按钮

,也会发生同样的事情
- (IBAction)restorePurchases:(id)sender
{
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}

3 个答案:

答案 0 :(得分:1)

[SKPayment paymentWithProductIdentifier:@"demo"];是一个破旧的功能

尝试使用SKPayment *payment = [SKPayment paymentWithProduct:thisProduct];

编辑:

你遗漏的另一件事是transactionOberver。

添加:

[[SKPaymentQueue defaultQueue] addTransactionObeserver:self];

您的代码将如下所示:

- (IBAction)purchaseProduct:(id)sender
{
    SKProduct *thisProduct = [productDetailsList objectAtIndex:[sender tag]];

    if ([thisProduct.productIdentifier isEqualToString:@"demo"]) 
    {
        SKPayment *payment = [SKPayment paymentWithProduct:thisProduct];
        [[SKPaymentQueue defaultQueue] addTransactionObeserver:self];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    }
}

答案 1 :(得分:1)

根据文件:

  

应用程序应始终至少有一名付款观察员   在添加付款请求之前排队。

听起来您的SKPaymentTransactionObserver可能会与您的IAP uiview一起被解除分配。

答案 2 :(得分:1)

要解决此问题,我已在代码中添加以下内容,以便在更改视图时删除观察者。

-(void)viewWillDisappear:(BOOL)animated {

[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

}