应用内购买的付款部分的EXC_BAD_ACCESS

时间:2011-08-27 01:34:40

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

我设置了UITableView个不同的应用内购买。每个选项都会将您带到一个视图控制器,该视图控制器也有代理人以及应用程序内购买的内容。更改plist文件以确定选择表视图中的哪个选项。一切正常。我放入NSLogs以确保变量已设置。然而,当我点击购买时,它只能工作一半的时间,而另一半我会得到

  

EXC_BAD_ACCESS

就行:

[[SKPaymentQueue defaultQueue] addPayment:payment];

在应用程序购买过程中,所有内容都设置正确,因为在我切换到这种方式之前它曾经工作过。我认为它可能与调用productsRequest有关,因为我在NSLog委托中设置didReceiveResponse并且它在第一次之后更快地收到响应。我卡住了。不工作的那些总是随机的,没有押韵或理由。任何帮助表示赞赏。

5 个答案:

答案 0 :(得分:11)

我遇到了这个问题,发现问题是我发布了我添加到默认SKPaymentQueue的事务观察器。显然,SKPaymentQueue不会保留其观察员,可能是为了防止保留周期。

所以,具体来说,我改变了这段代码:

- (void) setupAppStoreObserver {
    AppStoreObserver *appStoreObserver = [[AppStoreObserver alloc] init];   
    [[SKPaymentQueue defaultQueue] addTransactionObserver:appStoreObserver];
    [appStoreObserver release]; // This is the problem
}

对此:

- (void) setupAppStoreObserver {
    AppStoreObserver *appStoreObserver = [[AppStoreObserver alloc] init];   
    [[SKPaymentQueue defaultQueue] addTransactionObserver:appStoreObserver];

    // Note, we don't release the appStoreObserver because it is not
    // actually retained by SKPaymentQueue (probably to prevent retain cycles)
}

答案 1 :(得分:10)

您需要删除观察者:

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

答案 2 :(得分:4)

查找NSZombieEnabled它会将任何被解除分配的对象转换为一个对象,该对象将在何时和谁调用它时记录消息。这对于跟踪这些类型的EXC_BAD_ACCESS问题非常有用。

答案 3 :(得分:1)

  

MyStoreObserver * observer = [[MyStoreObserver alloc] init];

调用后,

观察者对象消失了。 创建成员变量来存储MyStoreObserver可能是一个修复。

答案 4 :(得分:0)

我有同样的症状:在addPayment上的EXC_BAD_ACCESS我的解决方案是不同的......最后,很容易。

阅读Ray Wenderlichs教程,他讨论了EXC_BAD_ACCESS错误,see this他说,当你试图访问已经解除分配的对象时,你会收到此错误。

我正在初始化ViewController确实加载的MyStoreObserver。我把它移到了initWithNibName ......你知道,就在模板输入的地方 //自定义初始化在这里。 我放在那里的代码是

    MyStoreObserver *observer = [[MyStoreObserver alloc] init];
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];