购买应用内购买时的EXC_BAD_ACCESS,仅在第二次进入商店后

时间:2012-09-09 13:40:49

标签: crash in-app-purchase exc-bad-access payment

好。我在应用程序中进行应用内购买。我有一个视图控制器作为我的应用程序的存储,用户可以从中购买。

当你第一次进入商店时,你可以买到很好的东西(尽可能多的购买),但如果你退出商店然后再回到商店就会变得很有气质。有时它会控制工作,但总是最终崩溃'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委托命令。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

错误消息表示正在将消息发送到InAppPurchaseManager的解除分配实例,这是您的类。在打开视图(创建实例),关闭视图(释放实例),然后再次打开视图(创建第二个实例)之后,就会发生这种情况。问题发生在addPayment:call中。这表明框架仍然处理旧的已发布实例,并尝试向其发送消息。

当您调用

时,您可以在loadStore中为框架提供对象的句柄
  [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

我没有看到你将自己作为观察者移除的任何地方。发送通知的对象通常不会保留其观察者,因为这样做会导致保留周期和/或内存泄漏。

dealloc 代码中,您需要清理并调用 removeTransactionObserver :.这应该可以解决你的问题。

- (void)dealloc {

    [[SKPaymentQueue defaultQueue]removeTransactionObserver:self];

    [super dealloc];
}