NSArrayM *返回" 0个对象"

时间:2014-04-01 14:29:49

标签: nsarray empty-list skproduct

我的代码中经常出现错误。 当应用程序构建完成后,它会完美运行,直到我点击应用内购买然后崩溃。

以下是错误日志:

  

*由于未捕获的异常'NSRangeException'而终止应用程序,原因:'* - [__ NSArrayM objectAtIndex:]:索引5超出范围   空数组'

     

* 第一次抛出调用堆栈:(0x30fd4f4b 0x3b6a66af 0x30f0b533 0xe03d9 0x11ce01 0x1217d3 0xf696b 0x3379b507 0x319af38b 0x30fa00df   0x30f9fcf7 0x30f9e093 0x30f08c27 0x30f08a0b 0x35bdc283 0x337ac049   0xdee93 0xdede8)libc ++ abi.dylib:以未捕获的异常终止   NSException类型(lldb)

相关代码:

//
//  main.m
//  Syntax
//
//

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); //This line in green with SIGABRT 1
    }
}

当我使用异常断点时,我得到以下结果:

- (void) purchase:(NSString*)purchase_id {
    if (![SKPaymentQueue canMakePayments]) {
        UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                            message:@"inApp purchase Disabled"
                                                           delegate:self
                                                  cancelButtonTitle:@"Ok"
                                                  otherButtonTitles:nil];
        [alertView show];
        [alertView release];

        return;
    }
    int ID = 0;

    if ([purchase_id isEqual: IAP_500_BYTES_PACK]){
            ID = 4;
    }
    else if ([purchase_id isEqual: IAP_1000_BYTES_PACK])
    {
            ID = 0;
    }
    else if ([purchase_id isEqual: IAP_3000_BYTES_PACK]){
            ID = 2;
    }
    else if ([purchase_id isEqual: IAP_7500_BYTES_PACK]){
            ID = 5;
    }

    else if ([purchase_id isEqual:  IAP_20000_BYTES_PACK]){
            ID = 1;
    }

    else if ([purchase_id isEqual:  IAP_50000_BYTES_PACK]){
            ID = 3;
    }

    else if ([purchase_id isEqual:  IAP_ADD_BACKGROUNDS]){
        ID = 6;
    }

    else if ([purchase_id isEqual:  IAP_FULL_VERSION]){
        ID = 7;
    }

SKProduct *productSK = [self.productRes objectAtIndex:ID]; // HERE is thread 1, breakpoint 1.1

if(productSK == nil){

        UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                message:@"Cannot connect to iTunes Connect"
                                                delegate:self
                                                cancelButtonTitle:@"Dismiss"
                                                otherButtonTitles:nil];
    [alertView show];
    [alertView release];
    return;
}

在局部变量区域中,它表示:

  

productSK __NSArrayM * @“0个对象”0x14d40300

我的问题是我无法找到为什么“productSK”为空。我认为它设置正确:

@property (strong, nonatomic) NSMutableArray *productRes;
@synthesize productRes;

请帮帮我吗?

1 个答案:

答案 0 :(得分:0)

NSRangeException表示您遇到的问题。您正在尝试从阵列中获取第5个元素,但该数组没有元素。换句话说,在崩溃时,内容为@[ ]

您应该在某个地方(可能在您的init方法中)设置一些代码self.productRes = ...,您可以在其中填写SKProduct * s以进行应用内购买。

此外,当您的应用程序崩溃并且调试器将您置于main时,崩溃几乎从未实际存在。这种情况发生在抛出异常但未被捕获时(因此它会一直到达程序的入口点)。发生这种情况时,您应该设置exception breakpoint以查看抛出异常的位置。