質問hereを参照してください。そのスレッドで提供"EXC_BAD_ACCESS:以前選択したフレームを復元できません" - クリーンアップされないスタック変数
ソリューションには、次のとおりです。
- がスタック上に行くだろうとどこで、どのように多くの変数あなたが宣言し、およそスマートであること。
- 必要に応じてGuard Mallocを無効にします。
また、一般的には 3.実際にメモリを割り当てた変数をリリースしていることを確認してください!!
上記の問題はありません。私が関数内で使用するスタック割り当ての変数はほとんどありません。例えば、それぞれの内部で2-3のようになります。しかし、関数はループで数回呼び出されるため、例外が発生するようです。
ここではキッカーですが、これは静的に割り当てられた変数の場合だけではなく、ヒープ上のものでもあります。私はNSNumber変数の自動解放された宣言のページエラーを取得しています。ループ内のいくつかの関数を使用して、関数のスコープ内で関数のスコープ内に割り当てて解放する辞書を呼び出します。
なぜこのようなことが起こっているのですか、なぜヒープ変数が影響を受けるのですか?私はまったくそれを得ていない、これにいくつかの光を投げてください。 :)
私はIOS5でXCode 4.2、iPhone/iPadシミュレータを使用しています。
ありがとうございます!
よろしく、 Devの
編集:サンプルコード
- (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の問題に直面していましたが、その時点でthisの質問を参照していました。しかし、私の場合、ループ内でスタック上に複数の変数を作成していないため、実行の過程で何度も呼び出される関数によって繰り返し作成されていました。理想的には、関数スコープの終わりに変数が破棄されたはずです。それがなぜ起こらなかったのか分かりません。
とにかくそれを解決し、複数の割り当てが発生しないようにするために、スタック割り当て変数をすべてstatic
として宣言しました。それは悪い習慣ですが、それは私がそれを働かせるためにしなければならなかったことです。そして、私が "doSomething"機能を使ってもう一度問題に直面するまで、それは働いていました。
"doSomething"の難しさは、スタック割り当て変数だけを作成するのではなく、ヒープ・マテリアルを作成するということでした。だから私は最初にEXC_BAD_ACCESSをNSInteger変数で取得し始めました。その時点で、静的変数として宣言することで、再度修正しようとしました。それはうまくいったが、今ではEXC_BAD_ACCESSが自動解放された変数と最後にカスタム割り当ての変数で発生し始めた。私はメモリ管理のすべてのルールに従っており、私はスタックアンドヒープ変数を持っています。それがヒープのものだけだったり、ループ内にスタックしていた場合は、どこかに間違いがあることがわかりました。しかし、ここでは、ループ内で呼び出されないONE関数内のスタックに完全に無害な変数が割り当てられています。また、決して得られない定期的な自動解放変数は、コードの別の場所からスローされます。すべてをさらに悪化させる原因は、この機能ではなく、プロジェクトの実行中に何度も呼び出されるすべてのものです。
Edit2:この場合、それは私のせいです。詳細は私の答えを見てください。人々の時間を無駄にして申し訳ありません。 :\
問題は、静的に割り当てられたオブジェクトと純粋に自動リリースされたオブジェクトの両方に関係しており、カスタムリリースのものではありませんので、ARCが役立つかどうかは疑問です。私はそれが役立つ場合、いくつかのサンプルコードで質問を編集することができます。 –