2012-09-09 144 views
0

好的。我的应用程序内购买了应用程序。我有一个视图控制器,充当我的应用程序的存储区,用户可以从中购买东西。EXC_BAD_ACESS在购买应用内购买时,仅在第二次进入商店后

第一次进店时你可以买东西很好(尽可能多的购买),但是如果你退出店铺,那么回到它就会变得有气质。有些时候它会有一定的工作量,但总是最终会因'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

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

你给框架手柄在loadStore你的对象,当你调用

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

我没有在任何地方看到你删除自身作为一个观察者。发送通知的对象通常不保留观察者,因为这样做可能会产生保留周期和/或内存泄漏。

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

- (void)dealloc { 

    [[SKPaymentQueue defaultQueue]removeTransactionObserver:self]; 

    [super dealloc]; 
}