我设置了UITableView
个不同的应用内购买。每个选项都会将您带到一个视图控制器,该视图控制器也有代理人以及应用程序内购买的内容。更改plist文件以确定选择表视图中的哪个选项。一切正常。我放入NSLogs以确保变量已设置。然而,当我点击购买时,它只能工作一半的时间,而另一半我会得到
EXC_BAD_ACCESS
就行:
[[SKPaymentQueue defaultQueue] addPayment:payment];
在应用程序购买过程中,所有内容都设置正确,因为在我切换到这种方式之前它曾经工作过。我认为它可能与调用productsRequest有关,因为我在NSLog
委托中设置didReceiveResponse
并且它在第一次之后更快地收到响应。我卡住了。不工作的那些总是随机的,没有押韵或理由。任何帮助表示赞赏。
答案 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];