我有一个奇怪的错误,我的自定义子视图在优化时出现在屏幕上完全错误的位置,但在关闭优化时可以正常工作。
以下是相关代码段:
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));
答案 0 :(得分:3)
将-mno-thumb
添加到编译器标志中。这是Xcode 4.2在Thumb模式下以armv6为目标的已知问题。