【问题标题】:EXC_BAD_ACESS when buying an in app purchase, only after going into the store the second timeEXC_BAD_ACES 购买应用内购买时,仅在第二次进入商店后
【发布时间】:2012-09-09 13:40:49
【问题描述】:

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

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

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

      [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    

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

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

    - (void)dealloc {
    
        [[SKPaymentQueue defaultQueue]removeTransactionObserver:self];
    
        [super dealloc];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多