在我的实现文件中,我有一个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风格的数组是否需要注意一些“问题”?
答案 0 :(得分:1)
文档很清楚 structs 不能包含ARC'd对象,我们可以说这也适用于多维数组基准,尽管它没有这么说。你试过这个:
static NSString __unsafe_unretained * TheColorArray[][3] = ...
这会将此处分配的对象从ARC中取出,并消除编译器在不应该的位置积极归零的任何可能性。
假设这是问题所在。也许如果你能够退回调试器,你能看到哪个符号在错误时被解除引用?
答案 1 :(得分:0)
事实证明,Crashlytics没有正确报告崩溃。地址,根据"真实" iPad上的崩溃报告不是0x11,而是看起来更像是一个合法的地址。经过进一步的测试,我发现有一个边缘情况,value
不在我的数组范围内,导致崩溃。
鉴于一切,我仍然会转移到NSArray*
NSString*
个{{1}}个对象,因为我还不了解ARC是否与c风格的数组配合得很好。