「exc_bad_access:以前に選択したフレームを復元できない」 - スタック変数がクリーンアップされていない

StackOverflow https://stackoverflow.com/questions/9302521

質問

質問に関して ここ.

そのスレッドで提供されるソリューションは、以下を含めます。

  1. あなたが宣言する変数の数といくつの変数について賢く、それはスタックに行きます。
  2. 必要に応じてガードMALLOCを無効にします。

また、一般的に:3。実際にメモリを割り当てた変数をリリースしていることを確認してください!!

上記の問題はありません。関数内で使用するスタックに割り当てられた変数はほとんどありません。たとえば、それぞれ2〜3です。しかし、関数はループで数回呼び出されるため、例外をトリガーするようです。

そして、これがキッカーです。これは、静的に割り当てられた変数だけでなく、ヒープにも発生しているだけでなく、ヒープにも起こっています。ループ内でいくつかを使用するNSNumber変数の自動リリースされた宣言のページエラーと、関数の範囲内で慎重に割り当ててリリースされる辞書を取得します。

では、なぜこれが起こっているのか、そしてなぜヒープ変数が影響を受けているのでしょうか?まったくわかりません。これに光を当ててください。 :)

Xcode 4.2、iPhone/iPadシミュレーターでiOS5を使用しています。

ありがとう!

よろしく、開発

編集:サンプルコード
- (void)doSomething {
NSInteger fun = 3;
NSInteger time = 4;
NSInteger overload = fun*time;
NSString *string = [NSString stringWithFormat:@"%d",overload];
NSObject *myCustomObject = [[NSObject alloc] init];
[myCustomDictionary setObject:myCustomObject forKey:string];
[myCustomObject release];
//myCustomDictionary is an iVar, alloced in the class's init method, and released in dealloc and not touched anywhere in between
}
//doSomething gets called several times through the course of execution as the state of the view changes, the user interacts with it etc, often 2-3 times during one state change.

コードは意図的に曖昧ですが、同時に、サンプルとまったく同じです。プロジェクト全体の残りのコードと同様です。いくつかの機能は、それぞれが少量の作業を行っており、これと同じくらいきれいに自己抑制されています。

私は以前にexc_bad_accessの問題に直面しましたが、その時点で言及していました これ 質問。しかし、私の場合、ループ内のスタック上に複数の変数を作成していませんでしたが、実行中に何度か呼ばれる関数によって繰り返し作成されていました。理想的には、変数は機能スコープの最後に破壊されただけです。なぜそれが起こらなかったのかわからない。

とにかく、それを解決し、複数の割り当てが起こらないようにするために、私はスタックに割り当てられた変数をすべてと宣言することになりました static. 。それは悪い習慣ですが、それはまさにそれを機能させるために私がしなければならなかったことです。そして、それは私が「dosomathe」関数で再び問題に直面するまで働いていました。

したがって、「dosomething」の難しさは、作成された変数だけが作成されていないが、ヒープのものも持っていなかったということでした。そこで、私は最初にnsinteger変数でexc_bad_accessを取得し始めました。その時点で、それらを静的と宣言することで、もう一度修正しようとしました。それはうまくいきましたが、今ではexc_bad_accessが自動リリースされた変数で発生し始め、最後にカスタムアロークされた変数 - これは私が困惑したときです。私はメモリ管理のすべてのルールに従っており、スタックとヒープの変数が私に潜在的な変数を持っています。それがヒープのものだけである場合、またはループ内のスタックを積み重ねる場合、どこかに間違いがあることを理解できました。しかし、ここでは、これらはループで呼び出されない1つの関数内のスタックに割り当てられている完全に無実の変数であり、コード内の別の場所からそれらに投げられたこともリリースされることもない通常の自動リリース変数です。さらに悪いことに、失敗ポイントはランダムであるということです - この関数だけでなく、プロジェクトの実行の過程で何度も呼ばれるすべての人が実際に呼ばれます。

編集2: この場合、それは私のせいです。詳細については、私の答えをご覧ください。人々の時間を無駄にしてすみません。 :

役に立ちましたか?

解決 3

ああ、私はこれを信じていません。

スタックに割り当てられたnsinteger変数が以前に直面した問題は保持されますが、この場合、それは完全に私のせいでした。

「DOSOMTHING」は一連の出来事の一部であり、私の側の愚かな過失により、何度もループすることになります。 。スタック変数がある場合でも、マロックされた変数がヒープに座っている場合でも、無限のループを使用して、何らかの形でクラッシュします。 :)

したがって、クラッシュは完全に公平であり、この場合、無関係であることが判明した前の問題と混乱しました。 :(

みんなの時間を無駄にしてすみません。

他のヒント

スタックトレース全体を見なければ、本当にあなたを助けることはできません。EXC_BAD_ACCESS トラブルシューティングのために何も意味しません。例外が何であるかを知る必要があります。

スタックタースを取得しないときの私の経験に基づいて、ダブルリリースしていることを意味します。ゾンビは、ダブルリリースを見つける方法です。

移動: Product -> Profile そして、選択します」Zombies「リストから。アプリを実行してクラッシュを引き起こすタスクを実行します。問題がダブルリリースの場合、ポップアップが表示されます。ポップアップの矢印を選択すると、オブジェクトがダブルリリースされていることを正確に示し、それはあなたに保持サイクルを示しています。

質問にコードが投稿されておらず、iOS 5とXcode 4.2を使用していることを確認してください。 Edit>Refactor>Convert to Objective-C ARC そして、すべてのメモリ管理の頭痛のさようならを振ります。

ARCはあなたのためにすべてのメモリ管理を行います。 deallocメソッドを保持、リリース、または作成する必要はありません。ほとんどの場合、メモリ管理について心配する必要はありません。あなたは神秘的なままになります EXC_BAD_ACCESS 後ろにクラッシュします。その仕組みは非常に効率的です。コンパイラは、保持してリリースし、最適化します。コードを見る必要さえありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top