iPhone应用程序分发构建包含一个错误。

4
解决方案: 在很多人的帮助下,我已经解决了这个问题。现在我写下来,以便有类似问题的人可以受益。为了重现这个错误,我必须在我的设备上运行分发版本构建。根据MrMage的建议,我将证书更改为开发者而不是分发,从而实现了这一点。这使我能够重现错误并进行调试。问题最终被确定为编译器忽略了所有对设置CGSize值的调用。我通过将目标首选项中的“优化级别”设置为“无”而不是“最快、最小”来防止这种情况发生。

你好,

我在我的应用程序中遇到了一个非常奇怪的问题。几天前,我的应用程序被批准进入应用商店,但令我惊讶的是,我很快发现其中有一个严重的错误。我去了我的电脑,但当我运行代码(在模拟器和设备上都运行)时,它完美地工作。我已经尝试了一切:重新编译和提交更新,清除所有目标,重新安装SDK等。

以下是问题的更详细描述。我的应用程序中有一个详细的表视图,它从在线源加载一些数据。它在下载时显示一个加载视图,然后在设置数据源后重新加载表视图。表格的单元格包含UITextView,它们的大小会根据文本而改变。当我在计算机上运行应用程序或在设备上进行调试时,文本被下载并完美地显示出来,但是当我从应用商店下载并启动它时,它只会显示文本一次,然后留下空白。我知道数据已经被下载了,因为texviews调整大小以适应文本,只是不显示它。

有人知道可能是什么原因导致这个错误吗?我如何知道我的分发构建是否包含错误,而在调试构建中没有显示出来呢?

您的, BEN。

附:我已比较了调试和分发构建的目标设置。我看到的唯一区别是“代码生成”下的“优化级别”。我尝试更改调试构建的设置,但它并没有揭示问题。


编辑:我通过执行MrMage建议的操作解决了问题。结果证明,这段代码确实是错误的原因。在调试器中运行时,“s”的宽度和高度属性始终为零,我无法改变这一点。我正在研究为什么会发生这种情况。

- (void) setText:(NSString *)string 
{

CGSize s = [string sizeWithFont:textView.font constrainedToSize:CGSizeMake(290, FLT_MAX)];
s.height += kStaticSize;

//SizeWithFont is very unreliable so have to do some dirty tweaking
if (s.height > 100 && s.height <= 250)
    s.height += 20;
else if (s.height > 250 && s.height <= 500) 
    s.height += 40;
else if (s.height > 500 && s.height <= 800 )
    s.height += 50;
else if (s.height > 800 && s.height <= 1200)
    s.height += 60;
else if (s.height > 1200 && s.height <= 1700)
    s.height += 100;
else if (s.height > 1700) 
    s.height += 200;

s.width = 290;
CGRect r = textView.frame; 
r.size = s;
[textView setFrame:r];

[self.textView setText: string];
[self.textView setNeedsDisplay];

}

1
当你找到最终解决方案时,你应该保持更新。这是一个有趣的问题,可能会遇到其他人。 - TechZen
好的建议,但我已经在我的原始帖子顶部这样做了。 - Benjamin Egelund-Müller
我认为理想的解决方案是找到错误的真正原因,将优化级别降低到类似于调试版本只是一个快速的解决方法。如果你的代码在逻辑上是正确的,那么无论二进制文件是否被优化,错误都不应该发生。 - Nicolas Miari
我记得有个朋友的程序只在Release版本上崩溃,而在Debug版本上却没有。后来发现他误用了C字符串函数,在未经优化的Debug设置中,变量两侧存在大量“安全”空内存填充,因此非法访问并未发生。也许你的代码出现了类似的情况。 - Nicolas Miari
4个回答

3

您是否尝试过将您的发布版本构建配置更改为iPhone开发人员的代码签名选项,然后在您的设备上测试该构建版本?

据我所知,现在您也可以上传使用开发人员证书签名的二进制文件。因此,您可以使用有效的开发人员构建版本并将其提交给苹果公司。


就这样!它完美地工作了(或者不完美,这正是我想要的)。当我这样做并在设备上运行时(模拟器中仍然没有问题),我会得到以前无法复制的错误。我将编辑我的第一篇帖子以展示这一点,并添加一些更多的信息来解释为什么会发生这种情况。 - Benjamin Egelund-Müller
然而,这是非常奇怪的行为。编译器不应该优化掉以后需要的变量更改。 - MrMage

2

你曾经测试过优化构建吗?优化器可以做一些非常奇怪的事情(比如重新排列你的代码),如果你有一个未初始化的变量,这可能会导致问题。

我还建议运行Clang(执行Build & Analyze)。


谢谢您的建议。我尝试运行clang,但没有找到任何东西。我还尝试了使用所有优化选项单独构建调试版本,但没有任何改变... - Benjamin Egelund-Müller

0

自从更新以来,你的代码有改动吗?(我希望你正在使用某种版本控制)我认为目标设置与此无关。

同时,如果这是一个非常严重的错误,我建议将其从商店中移除。接下来致力于使下一版稳定并进行全面测试。

(我认为你不需要使用自定义tableView单元格来调整文本大小,我相信股票苹果自带的可以自动完成调整。)


我绝对没有对源代码进行任何更改,并且我已经发布了更新以确保我没有。我确实也将我的应用程序下架了,这真的让我很烦恼。至于广泛测试它,没有什么比这更好的了。我的问题是,在我所有的测试环境中,该程序都非常稳定。 - Benjamin Egelund-Müller

0
在瞎猜的范畴内,我会考虑你的开发环境和正常操作环境之间的任何差异。例如,在我的开发环境中,我的iPhone默认使用我的wifi进行除电话以外的所有操作。由于某些网络操作对时间和带宽敏感,可能是通过3G/edge进行操作的问题。
我正在思考什么原因会导致文本视图缩放以容纳文本但不显示文本。如果没有内容可适应,则文本视图无法缩放以适合。这表明文本要么由空格组成,要么文本颜色的alpha为零。您是否设置了文本颜色/字体?

我已经在原始帖子中发布了源代码,就我所知,没有什么问题。 - Benjamin Egelund-Müller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接