【问题标题】:Apple rejected my app for crashing on iphone 5苹果拒绝了我的应用程序在 iphone 5 上崩溃
【发布时间】:2013-04-04 08:32:13
【问题描述】:

我知道这个问题已经被问过好几次了,但我正在寻找一个更一般的答案。 我为 iOS 6 开发了一个应用程序,我在模拟器(Retina 3.5 和 4 英寸)以及 iPhone 4 设备上对其进行了测试。 它从未崩溃过,但是当我将应用程序提交给 Apple 时,他们回答说:

我们发现您的应用在运行 iOS 6.1.3 的 iPhone 5 上启动时崩溃,

查看崩溃日志

我们看到它在第 164 行从索引越界崩溃,这是有道理的,因为我在那里有这段代码:

每当indexTimesArray 大于数组的长度时,我添加了“如果”来停止执行,并查看为什么会发生这种情况,但我无法重现错误。我从来没有像他们那样收到index out of bounds... 确实,我没有在 iPhone 5 设备上测试它,但我的电脑上有 XCode 4.6 和 iOS 6.1,还有带有 iOS 6.1.3 的 iPhone 4,但苹果公司的人也确实得到了应用程序崩溃了,那么如何重现错误? 我尝试从TestFlight 安装该应用程序,因为它将它作为一个全新的应用程序安装,就像他们在测试时一样,但仍然没有错误...

如何重现错误?会不会是构建设置有问题?

谢谢

[编辑] 我在对象的init方法中初始化timesArray的内容,像这样:

- (id)init{    
self = [super init];    
df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd HH:mm"];
rangeDates = [[NSArray alloc]initWithObjects:@"2013-04-11 10:00", @"2013-04-12 10:00", @"2013-04-13 10:00", @"2013-04-14 10:00", nil];    
timesArray = [[NSArray alloc]initWithArray:[NSArray arrayWithObjects:@"10:00", @"11:00", @"12:00", @"13:00", @"14:00", @"15:00", @"16:00", @"17:00", @"18:00", @"19:00", @"20:00", @"21:00", @"22:00", nil]];    
colorDictio = [[NSDictionary alloc]initWithObjects:[NSArray arrayWithObjects:[UIColor colorWithRed:0.74 green:0.66 blue:0.37 alpha:1.0], [UIColor colorWithRed:0.64 green:0.15 blue:0.11 alpha:1.0], [UIColor colorWithRed:0.313 green:0.65 blue:0.69 alpha:1.0], [UIColor colorWithRed:0.79 green:0.4 blue:0.59 alpha:1.0], [UIColor colorWithRed:0.45 green:0.55 blue:0.53 alpha:1.0], [UIColor colorWithRed:0.14 green:0.27 blue:0.66 alpha:1.0], nil] forKeys:[NSArray arrayWithObjects:@"showers area", @"zinctalks", @"zincnetwork", @"zincshows", @"zinclabs", @"zinczone", nil] ];
return self;
}

【问题讨论】:

  • 我之前在 Objective-C 中遇到过类似的错误...我的建议是将 self 与 NSMutableArrays 或 NSArrays 一起使用。
  • 你的意思是把数组声明为属性?
  • 用属性@property (nonatomic, retain) NSMutableArray* timesArray;声明你的数组
  • 然后在.m 文件中,无论您在哪里使用该数组,都将其用作self. timesArray
  • 酷,我试过了,但在 Apple 批准或拒绝之前,我仍然不知道它是否成功。

标签: ios


【解决方案1】:

要弄清楚如何重现该错误,您必须查看创建 timesArray 的代码。

出现越界错误是因为[timesArray count] 小于 2(或整个数组为零)。所以你必须弄清楚哪个条件会导致一个包含一个或零个对象的数组。也许它发生是因为没有互联网连接。

包装 objectAtIndex: 以检查数组的实际大小总是一个好主意。

我会将else { 替换为else if ([timesArray count] >= 2) { 并添加一个额外的else 来处理

【讨论】:

  • 为什么你说错误来自长度小于2?我认为这是一个越界,无论如何我从来没有得到那个错误,我需要的是能够重现苹果说应用程序崩溃的环境
  • 因为这是 sn-p 抛出越界错误的唯一方法。 (除了多线程竞争条件。) if 条件的“then”部分仅在边界允许时执行。那里不可能发生异常。而在“else”部分,当count - 2 为0 或更大时,不会发生异常。因此,唯一可能导致异常的可能是对象数少于 2 个的数组。
  • 另一个问题是你是否真的得到了越界异常。也许您的代码尝试访问无效内存是因为您犯了内存管理错误
【解决方案2】:

首先,这不是与操作系统相关的错误。您的应用程序正在崩溃,因为正在访问错误的数组索引。

  1. 如何重现该错误? :尝试使用您必须提供给苹果的相同凭据。
  2. 可能是构建设置有问题吗? : 没有。

要调试错误,您可以尝试在 if 之前打印 indexTimesArray 的值。此外,尝试打印您传递的所有值以访问数组元素。这将帮助您跟踪正在发送的错误索引。

【讨论】:

  • 凭证是什么意思?还要记住,使用我拥有的工具,我永远不会让索引越界,我需要的是重现 Apple 的环境,或者为什么它会与它们一起崩溃,而不是与我一起崩溃。
【解决方案3】:

感谢@mayur,他的评论是正确的答案,“我之前在 Objective-C 中遇到过类似的数组错误......我的建议是将 self 与 NSMutableArrays 或 NSArrays 一起使用”

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多