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

iPhone应用程序仅在3G上的发布模式下崩溃,iphone,crash,3g,release-mode,Iphone,Crash,3g,Release Mode,我正在编写一个应用程序,当我在带有“EXC\u BAD\u ACCESS”的UIScrollView上调用addSubview时,它会崩溃。它只在iPhone3G上以发布模式执行此操作,并且仅在设备上执行。我可以在所有其他配置中正常工作: iphone3g-调试模式 iPhone 3GS-调试和发布模式 iPhone4-调试和发布模式 模拟器-全部 此外,没有合理的理由说明为什么会发生这种情况。我的任何代码都不会释放我的对象。我建议您使用查找导致内存访问错误的原因 您是否使用调试/发布定义来分

我正在编写一个应用程序,当我在带有“EXC\u BAD\u ACCESS”的UIScrollView上调用addSubview时,它会崩溃。它只在iPhone3G上以发布模式执行此操作,并且仅在设备上执行。我可以在所有其他配置中正常工作:

iphone3g-调试模式 iPhone 3GS-调试和发布模式 iPhone4-调试和发布模式 模拟器-全部

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

我建议您使用查找导致内存访问错误的原因

  • 您是否使用调试/发布定义来分支代码
  • 您是否使用SDK版本检查器来分支代码
否则,我看不出你的应用程序在不同的设备/配置上如何表现不同。

我从来没有“解决”过这个问题,但我确实找到了有问题的代码。我怀疑这段石英代码中的某些东西在内核深处的某个地方导致了缓冲区溢出,而这只会在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);

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

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

我最近遇到了完全相同的问题,但我不完全确定原因是否相同。不过,我可以告诉你的是,是什么解决了我的问题(尽管我仍然不完全满意这个解决方案)

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

调试设置为“无”。 发布设置为“最快、最小”


将Release更改为“None”修复了崩溃(类似地,将Debug更改为“最快、最小”导致应用程序在启动时崩溃)。

我已启用NSZombie,但在这种情况下它不起作用。。另外,我没有使用任何SDK版本检查器。在我的HTTP库中有一些琐碎的东西,但这和代码的这一部分无关。您在这3个设备上分别运行哪些iOS?是否有使用调试/发布定义的条件编译?你提到一个正在被释放的对象,你能发布一些代码吗?嘿,经过大量的静态分析,使用泄漏工具进行性能分析,并仔细检查我的代码,我已经相当有信心这不是一个泄漏问题。我可能错了,但我已经发布了上面的代码中有问题的部分。随便看看。