iPhone应用程序仅在3G上的发布模式下崩溃

时间:2010-11-10 23:01:30

标签: iphone crash 3g release-mode

当我在带有“EXC_BAD_ACCESS”的UIScrollView上调用addSubview时,我正在编写一个崩溃的应用程序。它仅在iPhone 3G上以发布模式执行,仅在设备上执行此操作。我在所有其他配置中工作正常:

iPhone 3G - 调试模式 iPhone 3GS - 调试和释放模式 iPhone 4 - 调试和释放模式 模拟器 - 全部。

此外,没有理由说明为什么会发生这种情况。我的任何代码都没有发布我的对象。

5 个答案:

答案 0 :(得分:12)

我最近遇到了完全相同的问题,但我并不完全确定原因是一样的。我可以告诉你的是我解决了这个问题的原因(虽然我对解决方案仍然不满意)。

最后,它似乎是一个编译器问题,这可能会证实其他人对编译器优化的看法。 我正在使用Xcode 4.0(build 4A304a)。问题出在LLVM编译器2.0代码生成中。特别关键一点:“优化级别”

Debug设置为“None”。 发布被定为“最快,最小”

将Release更改为“None”修复了崩溃(并且类似地将Debug更改为“Fastest,Smallest”导致应用程序在启动时崩溃)。

答案 1 :(得分:2)

我建议您使用NSZombieEnabled找出导致内存访问不良的原因。

  • 您是否使用DEBUG / RELEASE定义来分支您的代码?
  • 您是否使用SDK版本检查程序来分支代码?

否则我无法看到您的应用在不同设备/配置上的表现如何不同。

答案 2 :(得分:1)

我可以建议将发布设置的优化级别更改为“无”。 我几次遇到同样的问题(使用不同的应用程序)并以这种方式解决了它。

答案 3 :(得分:0)

我从来没有“解决”过这个问题,但我确实追查了有问题的代码。我怀疑这段Quartz代码中的某些内容导致了内核深处的缓冲区溢出 - 这只会导致3G出现问题。这部分的一些设置不包括在内,但这绝对是它发生的地方:

gradient = CGGradientCreateWithColors(space, (CFArrayRef)colors, locations);
CGContextAddPath(context, path);
CGContextSaveGState(context);
CGContextEOClip(context);
transform = CGAffineTransformMakeRotation(1.571f);
tempPath = CGPathCreateMutable();
CGPathAddPath(tempPath, &transform, path);
pathBounds = CGPathGetPathBoundingBox(tempPath);
point = pathBounds.origin;
point2 = CGPointMake(CGRectGetMaxX(pathBounds), CGRectGetMinY(pathBounds));
transform = CGAffineTransformInvert(transform);
point = CGPointApplyAffineTransform(point, transform);
point2 = CGPointApplyAffineTransform(point2, transform);
CGPathRelease(tempPath);
CGContextDrawLinearGradient(context, gradient, point, point2, (kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation));
CGContextRestoreGState(context);
CGGradientRelease(gradient);

答案 4 :(得分:0)

你说“我的对象未被我的任何代码发布”。我发现在Objective-C中遇到代码没有明确释放对象而对象已被释放的情况并不少见。例如,在我的头顶上,假设您有一个保留计数为1的对象#1,然后释放它,然后意外地自动释放它。然后,自动释放池实际耗尽之前,你分配一个新的对象#2 - 这个新对象#2可以在与对象#1相同的地址分配,这是不可想象的。因此,当自动释放池随后被耗尽时,它将意外地释放对象#2。