0

好的。我的应用程序中有应用内购买。我有一个视图控制器,它充当我的应用程序的商店,用户可以从中购买东西。

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

任何帮助将不胜感激。

4

1 回答 1

4

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

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

  [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

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

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

- (void)dealloc {

    [[SKPaymentQueue defaultQueue]removeTransactionObserver:self];

    [super dealloc];
}
于 2013-06-14T11:01:20.970 回答