我在循环遍历NSString数组时发现了非常奇怪的行为。事情是它只在iOS 32位环境中发生,但在64位上按预期工作。
这是我运行的代码:
static NSString * const HexColors[3] = {
@"FFFFFF",
@"FF0000",
@"000000"};
static NSString * const ColorDescription[3] = {
@"white",
@"red",
@"black"};
在实现文件I中循环如下
- (void)loop {
NSInteger i = 0;
while (HexColors[i]) {
NSLog(@"%@", HexColors[i]);
i++;
}
}
我得到的结果:
2014-04-25 09:57:45.374 loopApp[587:60b] FFFFFF
2014-04-25 09:57:45.375 loopApp[587:60b] FF0000
2014-04-25 09:57:45.376 loopApp[587:60b] 000000
2014-04-25 09:57:45.376 loopApp[587:60b] white
2014-04-25 09:57:45.377 loopApp[587:60b] red
2014-04-25 09:57:45.377 loopApp[587:60b] black
然后app在NSLog行上抛出EXC_BAD_ACCESS
我可以使用"用于"循环,但事实并非如此
知道为什么会这样吗?这是铿锵声吗?
答案 0 :(得分:2)
该行:
while (HexColors[i]) ...
如果那里有一些NULL标记,只会停在数组的末尾,所以你有几个选项(至少)。
首先,你可以在那里放置一个NULL标记,用:
static NSString * const HexColors[] = {
@"FFFFFF",
@"FF0000",
@"000000",
NULL};
还要注意不确定的数组大小[]
,它根据数据本身创建一个数组。当您提供所有数据并且在添加项目时不希望更改太多时,这通常是首选。
第二个(不添加NULL元素),您可以使用更好的测试来限制循环:
for (i = 0; i < sizeof (HexColors) / sizeof (*HexColors); i++) ...
表达式sizeof (HexColors) / sizeof (*HexColors)
为您提供HexColors
中的数组元素数。
顺便说一下,你看到两个数组输出的原因是因为它们在内存中的布局。 ColorDescription
数组紧跟在HexColors
之后,所以就好像根据你的略微错误的循环只是一个数组。
然后,ColorDescription
之后是指针(或任意值被解释为指针),导致内存错误。
+---------+
HexColors | pointer | --> "FFFFFF" (all nul-terminated
| pointer | --> "FF0000" character arrays)
| pointer | --> "000000"
+---------+
ColorDescription | pointer | --> "white" (ditto)
| pointer | --> "red"
| pointer | --> "black"
+---------+
ArbitraryMemory | ??????? | --> ??????? (except here, which
+---------+ could be anything)
答案 1 :(得分:1)
更改while (HexColors[i])
条件。
while (i < arrayCount)
避免index 3 beyond bounds
。