【问题标题】:App Store code runs different from Xcode/Device code on iPhone 3GApp Store 代码与 iPhone 3G 上的 Xcode/Device 代码运行不同
【发布时间】:2011-10-12 11:45:23
【问题描述】:

我不知道如何解释这一点。我昨天向商店提交了我的一个应用程序的更新。 第一个屏幕截图是一个特定屏幕的显示方式运行在我的 iPhone 3G 上,运行 iOS 4.2.1,从 App Store 下载:

下面的第二张图片完全相同的代码,自原始提交以来没有进行任何更改,运行在通过 Xcode 连接的完全相同的设备上。 p>

应用程序运行良好在我的 iPhone 4 上,运行 iOS 5,从 App Store 下载。回顾一下:

  1. 从 App Store 获得的应用在 iPhone 3G 上有缺陷
  2. 从 App Store 获得的应用在 iPhone 4 上良好
  3. 通过 Xcode 绑定的应用在 iPhone 3G 上良好

这些不是唯一的图形不一致,但它们都与自定义 UITableViewCell 代码有关,该代码除了在每个目录中推送几个像素的标签之外没有做任何事情,并且从第一天起就一直运行良好。我已经向 idp-dts 提交了一份报告,正在等待他们的回复,但由于等待名单通常是一周或更长时间,我宁愿自己解决这个问题。

任何帮助/提示/猜测将不胜感激!

iPhone 3G 运行我的应用程序的 App Store 版本:

iPhone 3G 运行我的应用程序的 Xcode 绑定版本:

编辑:这听起来与这个问题非常相似:Building with LLVM and any optimization causes app to crash on startup 联系我的客户使用的是第二代 iPod Touch,这是除 iPhone 3G 之外唯一使用 armv6 的硬件。

编辑 2: 这是设置左侧颜色条边界的 sn-p 代码。代码中似乎没有任何可疑之处:

- (void)layoutSubviews {
    CGRect colorViewFrame = self.bounds;
    colorViewFrame.size.width = 6;
    colorViewFrame.origin.y += 3;
    colorViewFrame.origin.x -= 1;
    colorViewFrame.size.height -= 8;

    colorView.frame = colorViewFrame;
    ...
}

【问题讨论】:

  • 您的应用是针对哪个版本的 SDK 构建的?
  • iOS 5(GM 种子)是 Base SDK,而部署目标留在 iOS 4.0
  • 你说这是更新。是否可以使用保存在应用程序包之外的数据来计算偏移量?如果您删除应用并重新下载会怎样?
  • 删除并重新下载给我留下了拙劣的版本。所有的帧都是在 [UITableViewCell layoutSubviews] 内部动态计算的;方法,所以没有任何东西保存在外面。
  • 我该死的……你知道吗?我决定查看应用程序的构建设置,比较调试和发布方案之间的差异。一个区别是 LLVM 编译器优化级别。 Debug 设置为“None”,Release 设置为“Fastest, Smallest”。我将其更改为“最快、最小”以进行调试,现在可以在模拟器中重现。确定这是一个错误?我不想将未优化的代码提交到 App Store,但如果优化我的代码正在改变它的行为...... ??

标签: iphone objective-c ios cocoa-touch uitableview


【解决方案1】:

这是我在构建设置下找到的:

在编译器优化中学习了一两个类,这是有道理的。设备上的代码调试应保留其原始状态以进行调试,发布的代码应针对速度和效率进行优化。

所以这是有趣的部分。将我的调试设置更改为最快、最小:

导致我的设备在 Xcode 中运行时出现问题。

在提交 Radar 或做出任何轻率的决定以及向 App Store 提交未经优化的代码之前,我还有什么其他需要考虑的调查吗?编译器优化真的是布局问题的根本原因吗?

编辑:如果优化级别是问题所在,为什么优化后的代码在我的 iPhone 4 上运行正常,但在我的 iPhone 3G 上运行不正常?

编辑 2: 这个问题听起来与这个答案非常相似:Building with LLVM and any optimization causes app to crash on startup

编辑 3: 收到 Apple Radar 的回复,这是一个已知问题。将在 Xcode 的未来版本中修复。感谢大家的帮助!

【讨论】:

  • 听起来像是一个变量初始化问题——就像在某些情况下为您初始化的值,而在其他时候不是。
  • 听起来像是一个优化问题,但您可能应该在您的机器上本地测试调试和发布版本。发布执行单元格缩进的代码,也许有人可以提供帮助。
  • 这似乎是一个优化问题。我将养成在两种设备上同时测试调试和发布版本的习惯。我一直在我的 iPhone 4 上测试这两个版本,并在我的 iPhone 3G 上调试版本,但我没想到会在单个硬件和特定构建方案下出现问题。我想吸取的教训,但它仍然表明优化级别的错误,对吗?我将用代码更新原始问题。
  • 如果不清楚,我不反对。我是在建议我认为是哪种优化问题。
  • 是的,不,我认为你是对的。优化问题肯定会影响 [self bounds] 返回值,因此初始化肯定是一个因素。感谢您迄今为止的帮助。
【解决方案2】:

我遇到了同样的问题,并且找到了解决该问题的方法。

在对优化和未优化的代码进行了一些 NSLog 后,我发现 CGSize 在第一次访问高度参数后变得损坏。

所以这段代码在我的 UITableViewCell 子类 layoutSubviews 中:

  NSLog(@"size.height %f", size.height);
  NSLog(@"2nd access size.height %f", size.height);
  _titleLabel.frame = CGRectMake(kLeftSpacer, kSpacerHeight, kTitleWidth ,size.height);
  NSLog(@"after setFrame size.height %f", size.height);

在日志中给出以下内容:

大小.高度 19.000000

第二次访问 size.height 56.00000

setFrame size.height 56.00000 之后

所以,我的解决方法是使用中间高度标识符:

CGFloat height = size.height; 
NSLog(@"size.height %f", size.height);
_titleLabel.frame = CGRectMake(kLeftSpacer, kSpacerHeight, kTitleWidth ,height);
NSLog(@"after setFrame size.height %f", size.height);

一切都很好......

我想没有关闭优化那么安全,但我的应用程序的其余部分似乎还不错......然后最好使用发布版本进行测试!

【讨论】:

  • 我在 iOS 4.2.1 上使用 LLVM 3 并且打开了编译器优化时几乎遇到了这个确切的问题
【解决方案3】:

如果您要在表格视图单元格中添加和布局视图,则应将它们添加到单元格的 contentView 并在所有布局代码中使用 self.contentView.bounds 而不是 self.bounds

您还需要致电[super layoutSubviews],否则会发生很多奇怪的事情。

【讨论】:

  • 感谢 contentView 说明,我一定会更改此设置。 (不过,我无法想象这是这个问题的根本问题,因为更改编译器优化级别可以解决它。)我稍后在代码 sn-p 中调用 [super layoutSubviews]。
  • 好吧,你需要调用 [super layoutSubviews] 作为你重写方法的第一行。我并不是说你错了,但我认为编译器优化错误不太可能是这种行为的根本原因。它可能只是暴露了它的根本问题。
【解决方案4】:

答案是为 armv6 编译添加编译器标志 -mno-thumb,而不是为 armv7 编译添加它。

Howto 可用:Is there a way to compile for ARM rather than Thumb in Xcode 4?

【讨论】:

  • 该页面上的最佳答案还提到:“此外,目前 Xcode 4.2 附带的 LLVM 编译器 3.0 中存在一个错误(据我所知,该错误已在 4.2.1 中修复) ) 其中浮点计算在 Thumb for ARMv6 下编译错误。如果您使用的是特定版本的 Xcode,则需要这样做才能在旧设备上正常运行。所以我认为与其添加编译器标志,不如升级到 Xcode 4.2.1
  • 当然是 craig,但它需要您升级到 Lion
猜你喜欢
  • 2020-03-29
  • 2010-10-15
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
相关资源
最近更新 更多