我的代码中经常出现错误。 当应用程序构建完成后,它会完美运行,直到我点击应用内购买然后崩溃。
以下是错误日志:
*由于未捕获的异常'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;
请帮帮我吗?
答案 0 :(得分:0)
NSRangeException
表示您遇到的问题。您正在尝试从阵列中获取第5个元素,但该数组没有元素。换句话说,在崩溃时,内容为@[ ]
。
您应该在某个地方(可能在您的init
方法中)设置一些代码self.productRes = ...
,您可以在其中填写SKProduct *
s以进行应用内购买。
此外,当您的应用程序崩溃并且调试器将您置于main
时,崩溃几乎从未实际存在。这种情况发生在抛出异常但未被捕获时(因此它会一直到达程序的入口点)。发生这种情况时,您应该设置exception breakpoint以查看抛出异常的位置。