3

在我的实现文件中,我有一个 NSString* 的静态二维 c 样式数组,定义为:

static NSString* TheColorArray[][3] = {
    [RedType] = {@"red", @"blah", @"YES"},
    [BlueType] = {@"blue", @"yadda", @"YES"},
    .....
}

有问题的方法访问数组,如下所示:

-(NSString*)value:(NSInteger)value {
    return TheColorArray[value][0];
}

这一切似乎在大约 99% 的时间里都能正常工作......但是当它无法工作时,它总是会失败EXC_BAD_ACCESS - KERN_INVALID_ADDRESS at 0x11

我已经验证我的value参数没有超出数组的范围。地址似乎很奇怪0x11......这意味着数组尚未初始化。

那么这里发生了什么?对于 ARC 和 c 风格的数组,我需要注意一些“问题”吗?

4

2 回答 2

1

文档清楚地表明结构不能包含 ARC 对象,我们可以争辩说这也适用于多维数组基准,尽管它没有这么说。你试过这个:

static NSString __unsafe_unretained * TheColorArray[][3] = ...

这会将此处分配的对象从 ARC 中取出,并消除编译器在不应该出现的地方积极清空的任何可能性。

假设这就是问题所在。也许如果您能够退后一步使用调试器,您能否看到它出错时正在取消引用的符号?

于 2013-02-20T22:55:57.830 回答
0

事实证明,Crashlytics 没有正确报告崩溃。根据 iPad 上的“真实”崩溃报告,该地址不是 0x11,而是看起来更像合法地址的东西。经过进一步测试,我发现有一种极端情况value不在我的数组范围内,导致崩溃。

鉴于一切,我仍将转向对象NSArray*NSString*因为我还不明白 ARC 是否能很好地与 c 样式数组一起工作。

于 2013-02-21T14:00:45.977 回答