在Objective C中分配给数组元素会分配错误的索引

时间:2012-05-23 12:19:22

标签: objective-c arrays variable-assignment

我正在调试我的iPhone项目时看到一些相当奇怪的行为。除此之外,在UIViewController后代的头文件中,我有这个:

@interface OOGameDetailsViewController : UIViewController <OOXMLParserDelegate,OOServerDelegate>
{
    ...

    OOXMLNode *node;
    float elheights[6];

    ...
}

@property (readwrite, retain) OOXMLNode *gameNode;

...

@end

然后在代码中,我为这个数组赋值:

- (void)setNode:(OOXMLNode *)aNode
{
    node = aNode;
    [self updateUserDefaults];

    [background setImage:[gameNode imageFromKey:@"background"]];

    CGFloat maxw = 240.0f;

    NSString *text = [gameNode elementNodeWithKey:@"title"].value;
    CGSize sizeOfText=[text sizeWithFont:[UIFont boldSystemFontOfSize:20.0f]
                       constrainedToSize:CGSizeMake(maxw, CGFLOAT_MAX)
                           lineBreakMode:UILineBreakModeWordWrap];
    ...
    elheights[0] = 10 + sizeOfText.height;

    text = [gameNode elementNodeWithKey:@"age"].value;
    sizeOfText=[text sizeWithFont:[UIFont systemFontOfSize:16.0f]
                constrainedToSize:CGSizeMake(maxw, CGFLOAT_MAX)
                    lineBreakMode:UILineBreakModeWordWrap];
    ...
    elheights[1] = 10 + sizeOfText.height;

    ...
    elheights[2] = 10 + height;

    ...
    elheights[3] = 10 + separatorHeight;

    text = [gameNode elementNodeWithKey:@"intro"].value;
    sizeOfText=[text sizeWithFont:[UIFont boldSystemFontOfSize:14.0f]
                constrainedToSize:CGSizeMake(maxw, CGFLOAT_MAX)
                    lineBreakMode:UILineBreakModeWordWrap];
    ...
    elheights[4] = sizeOfText.height;

    ...
    elheights[5] = 20 + btnHeight;

    [mainTable reloadData];
}

这些想法非常简单:我将6个浮点值分配给6个元素的数组 - 索引从0到5.但是当我在调试器中单步执行此代码时,我始终看到每个赋值指定索引1高于指示的数组元素。也就是说,elheights[0] = ...实际上将此值分配给elheights[1],依此类推。最后一个赋值(赋值给索引为5的元素什么都不做)。

为了证明我没有疯狂,这里是调试器的截图(相关部分的作物 - 保持图像大小最小)。第一个是在作业之前,第二个是在作业之后。

enter image description here


enter image description here

我清理了项目并重新启动;我关闭了模拟器,关闭了Xcode,重新打开并重新启动 - 结果相同。 ObjectiveC处理简单C风格数组的方式有什么特别之处吗?

提前致谢, -Aleks

2 个答案:

答案 0 :(得分:0)

在逐步通过编译器重新排序指令的优化(即非-O0)代码时,我在Xcode中遇到了奇怪的调试器行为。尝试确保GCC_OPTIMIZATION_LEVEL不是您不期望的。

答案 1 :(得分:0)

默认情况下,XCode4使用新的LLDB调试器,但这并不总是完美无缺。 (例如,当前版本无法识别结构对齐属性)。它也有一些错误。

切换到GDB(如果您遇到问题,请单击工具栏中的Scheme / Edit Scheme,有两个选项的“Debugger”弹出按钮)。