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

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

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

EXC_BAD_ACCESS

在线上:

[[SKPaymentQueue defaultQueue] addPayment:payment];
Run Code Online (Sandbox Code Playgroud)

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

ben*_*ioT 11

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

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

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

对此:

- (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)
}
Run Code Online (Sandbox Code Playgroud)


Mil*_*0R3 10

你需要删除观察者:

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


cda*_*her 4

查找 NSZombieEnabled ,它将把任何被释放的东西放入一个对象中,该对象将在何时何人调用它时记录一条消息。这对于追踪这些类型的 EXC_BAD_ACCESS 问题非常有用。