在ARC下正确定义静态NSString * c样式数组

时间:2013-02-20 19:53:59

标签: objective-c automatic-ref-counting

在我的实现文件中,我有一个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风格的数组是否需要注意一些“问题”?

2 个答案:

答案 0 :(得分:1)

文档很清楚 structs 不能包含ARC'd对象,我们可以说这也适用于多维数组基准,尽管它没有这么说。你试过这个:

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

这会将此处分配的对象从ARC中取出,并消除编译器在不应该的位置积极归零的任何可能性。

假设这是问题所在。也许如果你能够退回调试器,你能看到哪个符号在错误时被解除引用?

答案 1 :(得分:0)

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

鉴于一切,我仍然会转移到NSArray* NSString*个{{1}}个对象,因为我还不了解ARC是否与c风格的数组配合得很好。