【问题标题】:iOS precision differences between debug/release builds messing up views?调试/发布版本之间的 iOS 精度差异会打乱视图吗?
【发布时间】:2012-01-02 08:33:47
【问题描述】:

我有一些代码试图修改一个 CGRect 的属性,并使用这个新框架设置另一个 CGRect:

actView         = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray ] autorelease];
actView.hidesWhenStopped = NO;
[actView startAnimating];
frame           = actView.frame;
frame.origin.x  = mainLabel.frame.origin.x - frame.size.width - TBLCELLPADDING;
frame.origin.y  = mainLabel.frame.origin.y;
actView.tag     = TBLCELLACTTAG;
actView.frame   = frame;
[cell.contentView addSubview:actView];

这适用于较新 iPhone 的调试版本和发布版本。然而,在 3G iPhone 的发布版本上运行会产生一些疯狂的结果并打乱视图。

预期结果(适用于较新的手机):

2012-01-01 14:41:43:449 myapp [691:775] Loading MainLabel: 122.000000 26.000000
2012-01-01 14:41:43:605 myapp[691:775] Loading Frame: 97.000000 26.000000
2012-01-01 14:41:43:713 myapp[691:775] Loading ActView: 97.000000 26.000000

iPhone 3G 运行 4.2 固件和 Release Build 的结果(这发生在任何固件上):

2012-01-01 14:43:39:516 myapp[706:775] Loading MainLabel: 122.000000 26.000000
2012-01-01 14:43:39:589 myapp[706:775] Loading Frame: 26.000000 26.000000
2012-01-01 14:43:39:792 myapp[706:775] Loading ActView: 26.000000 0.000000

这会破坏我在这款旧款 iPhone 上的应用的所有浏览量。
有没有办法我应该专门在代码方面处理这个问题?或者我应该修改旧 iPhone 的构建设置中的某些内容吗?

【问题讨论】:

  • 听起来像是某种竞争条件。
  • 在设置 frame.origin.x 的行之前添加某种睡眠调用(或 spinwait)。如果这样可以解决问题,那么您就有了一个竞争条件,您应该使用适当的同步来修复它。

标签: iphone ios build


【解决方案1】:

由于该问题仅存在于基于ARMV6的设备上,并且仅在构建优化代码时,它可能是由于llvm的ARMV6优化错误造成的。

将以下内容作为用户定义的设置添加到您的构建设置中:

GCC_THUMB_SUPPORT = NO

它应该是这样的:

这样做的是,它完全禁用了为您的应用构建的 thumb 指令集。如果这导致应用正常运行,请检查应用在 ARMV7 设备上是否仍能正常运行,因为此设置可能会严重影响性能。

尽管这似乎是 GCC 特定的设置,但 LLVM 仍然尊重这一点,并且在我需要更新的一些旧项目中节省了我的精力。

【讨论】:

  • 这是正确的解决方案,并且在 Xcode 4.3 beta 中也已修复。
  • @JoshuaWeinberg 很高兴知道 Apple 终于解决了这个问题,感谢您的宣传。
  • 是的,这解决了我的问题。所以这是在 4.3 及更高版本中修复的,据说?较新版本的 xcode 中的修复会减慢 armv7 的编译速度吗?
【解决方案2】:

如果应用在旧手机上运行,​​您始终可以指定不同的代码设置。使用预编译器标题。

【讨论】:

  • 如果是竞态条件,那么很可能所有手机上都存在该错误,但只会在旧手机上被发现。在这种情况下,隐藏症状不是正确的解决方案。
  • 你有什么建议?似乎唯一的其他选择就是和它一起生活......
猜你喜欢
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
相关资源
最近更新 更多