当我在带有“EXC_BAD_ACCESS”的UIScrollView上调用addSubview时,我正在编写一个崩溃的应用程序。它仅在iPhone 3G上以发布模式执行,仅在设备上执行此操作。我在所有其他配置中工作正常:
iPhone 3G - 调试模式 iPhone 3GS - 调试和释放模式 iPhone 4 - 调试和释放模式 模拟器 - 全部。
此外,没有理由说明为什么会发生这种情况。我的任何代码都没有发布我的对象。
答案 0 :(得分:12)
我最近遇到了完全相同的问题,但我并不完全确定原因是一样的。我可以告诉你的是我解决了这个问题的原因(虽然我对解决方案仍然不满意)。
最后,它似乎是一个编译器问题,这可能会证实其他人对编译器优化的看法。 我正在使用Xcode 4.0(build 4A304a)。问题出在LLVM编译器2.0代码生成中。特别关键一点:“优化级别”
Debug设置为“None”。 发布被定为“最快,最小”
将Release更改为“None”修复了崩溃(并且类似地将Debug更改为“Fastest,Smallest”导致应用程序在启动时崩溃)。
答案 1 :(得分:2)
我建议您使用NSZombieEnabled找出导致内存访问不良的原因。
否则我无法看到您的应用在不同设备/配置上的表现如何不同。
答案 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。