iPhone上的编译器优化和UIView框架

时间:2012-01-24 23:44:39

标签: iphone optimization llvm

我有一个奇怪的错误,我的自定义子视图在优化时出现在屏幕上完全错误的位置,但在关闭优化时可以正常工作。

以下是相关代码段:

CGPoint newPoint = [self locationOfItem:i];
NSLog(@"setting new point to %@", NSStringFromCGPoint(newPoint));

CGRect newFrame = CGRectMake(newPoint.x, newPoint.y, view.frame.size.width, view.frame.size.height);
view.frame = newFrame;
NSLog(@"cell frame is %@ %@", NSStringFromCGRect(view.frame), NSStringFromCGRect(newFrame));

如果没有优化,这将完美无缺。在除-O0之外的任何优化标记下(我使用-Os,但问题出现在任何非零优化级别),我得到:

2012-01-24 18:37:11.881 MyApp[36498:707] setting new point to {8, 92}
2012-01-24 18:37:11.884 MyApp[36498:707] cell frame is {{8, 8}, {68, 80}} {{8, 8}, {68, 80}}
坦率地说,这是一个可怕的回应。

请注意newPoint的y坐标为92,但在设置为矩形然后传递给UIView#setFrame后,它变为8,这完全打破了我的显示逻辑。

这里发生了什么?优化怎么会导致这种情况发生?

我使用LLVM 3.0,Xcode 4.2.1,编译为armv6。

更新

以下代码似乎运行良好:

    CGRect frame;
    frame.origin = newPoint;
    frame.size = view.frame.size;
    view.frame = frame;
    NSLog(@"setting cell frame3 to %@ %@", NSStringFromCGRect(view.frame), NSStringFromCGRect(frame));

1 个答案:

答案 0 :(得分:3)

-mno-thumb添加到编译器标志中。这是Xcode 4.2在Thumb模式下以armv6为目标的已知问题。