应用程序在低网络中崩溃,如(EDGE,100%损失)

Nav*_*avi -1 crash networking objective-c in-app-purchase ios

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

 _completionHandler(YES, skProducts);
Run Code Online (Sandbox Code Playgroud)

该方法的代码

#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;


}
Run Code Online (Sandbox Code Playgroud)

我正在关注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];

}
Run Code Online (Sandbox Code Playgroud)

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

jrt*_*ton 7

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

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

if(_completionHandler)
{
    _completionHandler(YES, skProducts);
}
Run Code Online (Sandbox Code Playgroud)

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