在应用购买测试期间的EXC_BAD_ACCESS

时间:2011-08-22 11:06:25

标签: iphone objective-c xcode in-app-purchase storekit

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

    SKPayment *payment = [SKPayment paymentWithProduct:electronicProd];
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] addPayment:payment];

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

UPDATE:FIXED意外地留在了添加额外事务观察者的代码中lol

7 个答案:

答案 0 :(得分:40)

我遇到了同样的问题,我的解决方案是打电话

[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

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

答案 1 :(得分:26)

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

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}

希望这有帮助!

答案 2 :(得分:12)

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

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

deinit {
    SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}

答案 3 :(得分:10)

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

- (void)viewDidLoad {
   //... stuff
   SKProduct* electronicProduct = //...
   [electronicProduct retain];
   //... otherstuff
}

viewDidLoad由系统在自动释放池中包装,paymentWithProduct:返回一个autorelease对象。完成viewDidLoad后,将释放所有自动释放对象,这就是为什么在以后尝试访问时会出现内存访问不良的原因。

答案 4 :(得分:2)

我有同样的错误,真的很难解决。在我的头文件中,我声明了SKProduct:

@property SKProduct *product;

我刚将其改为:

@property (retain) SKProduct *product;

一切正常。 希望这有助于某人。

答案 5 :(得分:1)

如果您要为SKPaymentTransactionObserver创建专用课程,请不要忘记必须保留该课程。

我在意识到这一点之前得到了错误,这是AppDelegate中的一个例子:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var myTransactionObserver: MyTransactionObserver!


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        // don't
        let myTransactionObserver = MyTransactionObserver()

        // do
        myTransactionObserver = MyTransactionObserver()

        SKPaymentQueue.default().add(myTransactionObserver)

        return true
    }

    // ...
}

答案 6 :(得分:0)

我有同样的问题,我的解决方案是打电话 [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

关于商店观察员交易完成/失败/完成回调