crash - EXC_BAD_ACES 购买应用内购买时,仅在第二次进入商店后

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

好的。我的应用程序中有应用内购买。我有一个 View Controller ,它充当我的应用程序的商店,用户可以从中购买东西。

第一次进入商店时,您可以很好地购买东西(想买多少就买多少),但是如果您退出商店,然后再回到那里,就会变得喜怒无常。有时它会继续工作一点,但所有时间它最终都会因“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]));
}
}

另一个类似的问题说这是因为它有其他代码添加了多个事务观察器,但这是我唯一称呼它的地方。但当然,每次购买尝试都会调用一次。我在 View 中执行 productsrquest 委托(delegate)命令确实加载了。

任何帮助将不胜感激。

最佳答案

错误消息表明消息正在发送到 InAppPurchaseManager 的已释放实例,即您的类。它发生在您打开 View (创建实例)、关闭 View (释放实例)、然后再次打开 View (创建第二个实例)之后。问题发生在 addPayment: 调用中。这表明框架仍然拥有旧的已发布实例的句柄,并且正在尝试向其发送消息。

当您调用时,您在 loadStore 中为框架提供了对象的句柄

  [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

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

在您的 释放 您需要清理的代码并调用 removeTransactionObserver :.那应该可以解决您的问题。
- (void)dealloc {

    [[SKPaymentQueue defaultQueue]removeTransactionObserver:self];

    [super dealloc];
}

关于crash - EXC_BAD_ACES 购买应用内购买时,仅在第二次进入商店后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12339566/

相关文章:

crash - 由于不允许使用 keychain-access-groups 权利而被杀死的应用程序(错误代码 -67050)

ios - 应用内支付 : unclear use-case (restoreCompletedTransactions)

iphone - 查看应用内购买销售额

ios - 消耗品 - 此应用内购买已被购买。它将免费恢复

iphone - 对象类型更改

iphone - EXC_BAD_ACCESS 在 setCollectionViewLayout 上

java - 单击Button时,App崩溃(在两个类之间传递字符串。)

如果在按住抽屉导航项时处于后台,Android 应用程序会崩溃

ios - 'NSInternalInconsistencyException',原因 : 'containerView is required.'

core-data - 尝试使用 NSFetchedResultsController 创建 USE_BLOCK_IN_FRAME ... EXC_BAD_ACCESS