我遍历NSString数组时发现了非常奇怪的行为。事实是,它仅在iOS 32位环境中发生,但在64位环境下可以正常工作。
这是我运行的代码:
static NSString * const HexColors[3] = {
@"FFFFFF",
@"FF0000",
@"000000"};
static NSString * const ColorDescription[3] = {
@"white",
@"red",
@"black"};
在实现文件中,我如下循环
- (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
然后应用在NSLog行上抛出EXC_BAD_ACCESS
我可以使用“ for”循环,但事实并非如此
知道为什么会发生吗?这是the的问题吗?
该行:
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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句