【问题标题】:Assigning to array element in Objective C assigns to wrong index在Objective C中分配给数组元素分配给错误的索引
【发布时间】:2012-05-23 12:19:21
【问题描述】:

在调试我的 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。但是,当我在调试器中逐步执行此代码时,我始终看到每个assignments 分配索引 1 高于指示的数组元素。也就是说,elheights[0] = ... 实际上将此值分配给elheights[1] 等等。最后一个赋值(赋值给索引为 5 的元素什么都不做)。

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


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

提前致谢, -阿列克斯

【问题讨论】:

  • 如果您使用的是 LLDB,请尝试切换到 GDB。这可能只是调试器中的一个错误。
  • @hamstergene 我正在使用 XCode 中的任何默认调试器
  • 如果你NSLog而不是询问调试器会发生什么?
  • @AleksG 点击工具栏中的Scheme / Edit Scheme,弹出“Debugger”按钮,有两个选择。
  • @hamstergene 就是这样!切换调试器后,一切正常。请发布您的 cmets 作为答案,我会接受。

标签: objective-c arrays variable-assignment


【解决方案1】:

XCode4 默认使用新的 LLDB 调试器,但它并不总是能完美运行。 (例如,当前版本不识别结构对齐属性)。它也到处都有一些错误。

如果您遇到问题,请切换到 GDB(单击工具栏中的方案 / 编辑方案,有“调试器”弹出按钮有两个选项)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多