6

「EXC_BAD_ACCESS」を使用してUIScrollViewでaddSubviewを呼び出すとクラッシュする、作成中のアプリがあります。これは、リリースモードのiPhone 3Gでのみ、デバイスでのみ実行されます。私はこれらの他のすべての構成で正常に動作します:

iPhone3G-デバッグモードiPhone3GS-デバッグおよびリリースモードiPhone4-デバッグおよびリリースモードシミュレータ-すべて。

さらに、これが発生するはずの合理的な理由はありません。私のオブジェクトは私のコードのいずれによっても解放されません。

4

5 に答える 5

12

私は最近まったく同じ問題を抱えていましたが、原因が同じであるかどうかは完全にはわかりません。私があなたに言うことができるのは、私にとって問題を解決したものです(私はまだ完全に解決策に満足しているわけではありませんが)。

結局、それはコンパイラの問題のように思われ、これは他の人がコンパイラの最適化について言ったことを確認するかもしれません。Xcode 4.0(ビルド4A304a)を使用しています。問題はLLVMコンパイラ2.0コード生成にありました。特に1つの重要な点:「最適化レベル」

デバッグは「なし」に設定されました。リリースは「最速、最小」に設定されました

リリースを「なし」に変更するとクラッシュが修正されました(同様にデバッグを「最速、最小」に変更すると、起動時にアプリがクラッシュしました)。

于 2011-05-19T21:38:08.830 に答える
2

NSZombieEnabledを使用して、メモリへの不適切なアクセスの原因を突き止めることをお勧めします。

  • コードを分岐するために DEBUG / RELEASE 定義を使用していますか?
  • SDK バージョン チェッカーを使用してコードを分岐していますか?

そうしないと、アプリがさまざまなデバイス/構成でどのように異なる動作をするかわかりません。

于 2010-11-10T23:27:55.010 に答える
1

リリース設定の最適化レベルを「なし」に変更することを提案できます。私は(別のアプリで)同じ問題に数回遭遇し、この方法で解決しました。

于 2011-01-13T15:35:14.643 に答える
0

私のオブジェクトは私のコードのいずれによっても解放されません」とあなたは言います。Objective-C では、コードがオブジェクトを明示的に解放していないのに、オブジェクトがまったく解放されているという状況に遭遇することは珍しくありません。たとえば、私の頭の中で、保持カウントが 1 のオブジェクト #1 があり、それを解放した後、誤って自動解放したとしましょう。次に、自動解放プールが実際に空になる前に、新しいオブジェクト #2 を割り当てます。この新しいオブジェクト #2 がオブジェクト #1 と同じアドレスに割り当てられることは考えられません。そのため、その後自動解放プールが空になると、誤ってオブジェクト #2 が解放されます。

于 2010-11-19T17:43:54.693 に答える
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);
于 2010-11-19T17:18:19.647 に答える