我的项目中有大量的视图,我会对程序进行重新调整大小和重新定位子视图。我在layoutSubviews
中执行此操作,使用以下代码:
CGRect rect = self.btnOne.frame;
// change values for rect
self.btnOne.frame = rect;
// re-use same CGRect to reposition other views
rect = self.btnTwo.frame;
// change values
self.btnTwo.frame = rect;
// etc. ...
这种类型的代码现在已经好几年了。我最近在同事的项目中添加了一堆这样的代码,现在它开始表现得非常奇怪了。我无法理解,现在这里重用的rect
对象有时会在分配视图框架和重新分配到视图框架结束时随机更改自己的值。块。结果是位于错误位置的子视图。似乎错误通常采用rect.origin.x
的形式以某种方式获取rect.origin.y
的值,反之亦然。
即使更奇怪,这个问题只发生在真实的设备上;在模拟器上运行的完全相同的代码没有问题。
修复是为每个子视图使用唯一声明的CGRect对象,如下所示:
CGRect rect = self.btnOne.frame;
// change values for rect
self.btnOne.frame = rect;
// declare new CGRect to reposition other views
CGRect rect2 = self.btnTwo.frame;
// change values
self.btnTwo.frame = rect2;
当我进行此更改时,一切都恢复正常。但是我真的很想知道为什么会发生这种情况,特别是知道它为什么会在设备上发生而不是在模拟器上发生。它似乎也不会发生,直到同事对视图进行更改,虽然我不清楚任何更改(与视图定位无关)如何做到这一点。
另一个变化是代码导入的项目是使用ARC,而我原来的代码不是。
答案 0 :(得分:1)
如果真的没有其他事情发生,那听起来像编译器错误。 CGRects没有什么神奇之处。它们只是结构。
您是否在优化和不优化的情况下获得相同的结果?在不同的编译器上(如果你还有gcc-llvm vs clang,gcc)?
这一切都在armv7设备上吗? armv6设备上存在拇指代码的已知问题,并且在过去它尚未被禁用。从Xcode 4.3开始,Apple似乎想要关闭所有拱门的拇指。
如果代码与您显示的一样简单,那么 就不应该查看程序集。
我一直在重复使用CGRect。