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

问题描述:

我有一个应用程序,当我在UIScrollView上用“EXC_BAD_ACCESS”调用addSubview时,我正在写这个应用程序。它只在iPhone 3G上以释放模式进行,并且仅在设备上进行。我的作品在所有这些其他配置罚款:iPhone应用程序仅在3G上的发布模式下崩溃

iPhone 3G - 调试模式 的iPhone 3GS - 调试和发布模式 iPhone 4 - 调试和发布模式 模拟器 - 所有。

此外,为什么会出现这种情况没有理性的原因。我的对象不是由我的任何代码发布的。

我建议您使用NSZombieEnabled来找出是什么导致对内存访问不良。

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

否则我看不到您的应用程序在不同的设备/配置上可能表现如何不同。

+0

我有NSZombieEnabled,但它在这种情况下不起作用。另外,我没有使用任何SDK版本检查器。在我的HTTP库中有一些微不足道的东西,但这与代码的这个区域无关。 – whitehawk 2010-11-10 23:43:28

+0

你在哪三个设备上运行了哪个iOS?你有使用DEBUG/RELEASE定义的条件编译吗?你提到一个被释放的对象,你可以发布一些代码吗? – 2010-11-10 23:54:06

我从来没有“解决”这个,但我确实追查了违规代码。我怀疑这段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); 

你说“我对象不受任何我的代码发布”。我发现在Objective-C中遇到代码没有明确释放对象但对象已经释放完全相同的情况并不罕见。例如,我的头顶,让我们说,你有一个保留计数为1的对象#1,然后释放它,但意外地自动释放它。然后,之前自动释放池实际耗尽,您分配一个新的对象#2 - 这是不可思议的,这个新的对象#2可以分配在对象#1相同的地址。所以当autorelease池随后被耗尽时,它会意外释放对象#2。

+0

嘿,经过广泛的静态分析,使用泄漏工具进行性能分析以及仔细检查我的代码之后,我相当确信这不是泄漏问题。我可能是错的,但我已经发布了上面的代码片段。随意去看看。 – whitehawk 2010-11-23 17:27:34

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

我最近有同样的问题,但我不完全确定原因是一样的。我可以告诉你的是什么解决了我的问题(尽管我仍然不完全满意解决方案)。最后,它看起来像是一个编译器问题,这可能证实其他人对编译器优化所说的话。 我正在使用Xcode 4.0(构建4A304a)。问题在于LLVM编译器2.0代码生成。一个特别的关键:“优化级别”

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

将发布更改为“无”修复了崩溃(同样将Debug更改为“Fastest,Smallest”导致应用程序在启动时崩溃)。

+0

这是我的答案!非常感谢! – datayeah 2015-03-10 16:48:34