-1

我的应用程序实现应用内购买应用程序在连接到 EDGE 网络时崩溃,100% 丢失,网络非常差。没有崩溃日志。但它 "EXC BAD ACCESS code=1 address=0xc "在下一行说

 _completionHandler(YES, skProducts);

方法代码

#pragma mark - SKProductsRequestDelegate

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    sharedManager=[Mymanager sharedManager];

    _productsRequest = nil;
    sharedManager.bookidList=[[NSMutableArray alloc]init];
    sharedManager.sharedProductPrice=[[NSMutableArray alloc]init];
    NSArray * skProducts = response.products;
    NSLog(@"sk product %@",skProducts);
   // NSMutableArray *a=[[NSMutableArray alloc]init];
    for (SKProduct * skProduct in skProducts) {

        [sharedManager.sharedProductPrice addObject:skProduct.price];
        [sharedManager.bookidList addObject:skProduct.productIdentifier];
    }
   [self updatePlist];
    _completionHandler(YES, skProducts); //EXC BAD ACCESS CODE =1  ADDRESS=0XC 
    _completionHandler = nil;


}

我正在关注 Ray Wenderlich 网站上的应用内购买教程(适用于 iOS6.0)。我的应用程序的最低目标是 iOS5。任何指示如何解决此崩溃?

编辑

新的变化,我将 NSArray 设置为强大的 ARC 属性,它仍然会在下面的图片中崩溃检查

代码

在此处输入图像描述

.h 文件 在此处输入图像描述

教程

从 iTunes Connect 检索产品信息的方法:

- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler {

    // 1
    _completionHandler = [completionHandler copy];

    // 2
    _productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers];
    _productsRequest.delegate = self;
    [_productsRequest start];

}

这首先将完成处理程序块的副本存储在实例变量中,以便它可以在产品请求异步完成时通知调用者。然后它创建一个新的 SKProductsRequest 实例,这是 Apple 编写的类,其中包含从 iTunes Connect 中提取信息的代码。它非常易于使用——您只需给它一个委托(符合 SKProductsRequestDelegate 协议),然后调用 start 让事情运行。我们将 IAPHelper 类本身设置为委托,这意味着它会在产品列表完成(productsRequest:didReceiveResponse)或失败(request:didFailWithErorr)时收到回调。说到委托回调,接下来添加它们!在@end 之前添加以下代码:

4

1 回答 1

7

很可能_completionHandlernil当您在上面的方法中调用它时。当变量为 nil 时尝试执行块变量确实会产生错误的访问错误。

您可以通过将完成处理程序块的执行包装在 if 语句中来确认这一点,并且仅在变量不为 nil 时才执行它:

if(_completionHandler)
{
    _completionHandler(YES, skProducts);
}

解决问题是另一回事,您需要跟踪调用并查看何时未传递或删除完成块。

于 2013-08-05T06:41:38.980 回答