在应用购买测试期间的EXC_BAD_ACCESS

Bar*_*lor 22 iphone xcode objective-c storekit in-app-purchase

为我的应用内购买运行测试(第一次在应用内购买).我在这段代码的第三行得到了EXC_BAD_ACCESS:

    SKPayment *payment = [SKPayment paymentWithProduct:electronicProd];
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
Run Code Online (Sandbox Code Playgroud)

这是一个按钮的IBAction.electronicPack在标题中声明为SKProduct.在productsRequest didReceiveResponse中抛出了一些NSLog,当请求产品时(在viewDidLoad中),他们表明它正确地获取产品并将其存储在electronicPack中.在didReceiveResponse页面中将electronicPack定义为[[request.products] objectAtIndex:0].所以是的.多数民众赞成在哪里,不知道该怎么做.任何帮助表示赞赏.

更新:FIXED意外遗留在添加额外事务观察器的代码中lol

Mr.*_*. T 40

我有同样的问题,我的解决方案是打电话

[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
Run Code Online (Sandbox Code Playgroud)

将应用程序商店留在我的应用程序中.也许它会在将来帮助某人.


Zor*_*ayr 26

似乎问题是在删除前一个之前尝试添加事务观察器.将以下内容添加到控制器以解决此问题:

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 太棒了,谢谢!! 对我来说,这也很有用,使用Mihael Isaev的代码(如下)并将其放入ViewDidDisappear中. (2认同)

imi*_*ike 12

Mr.T回答是最好的解决方案!

在swift中,我在这里调用removeTransactionObserver:

deinit {
    SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}
Run Code Online (Sandbox Code Playgroud)


and*_*azz 10

您需要保留您正在创建的对象

- (void)viewDidLoad {
   //... stuff
   SKProduct* electronicProduct = //...
   [electronicProduct retain];
   //... otherstuff
}
Run Code Online (Sandbox Code Playgroud)

viewDidLoad由系统在自动释放池中包装,paymentWithProduct:返回一个autorelease对象.当viewDidLoad完成后,将释放所有自动释放对象,这就是为什么当您稍后尝试访问它时会获得错误的内存访问.