2012-02-15 8 views
1

質問hereを参照してください。そのスレッドで提供"EXC_BAD_ACCESS:以前選択したフレームを復元できません" - クリーンアップされないスタック変数

ソリューションには、次のとおりです。

  1. がスタック上に行くだろうとどこで、どのように多くの変数あなたが宣言し、およそスマートであること。
  2. 必要に応じて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:この場合、それは私のせいです。詳細は私の答えを見てください。人々の時間を無駄にして申し訳ありません。 :\

答えて

0

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

スタック割り当てのNSInteger変数で直面する問題はありますが、この場合はまったく私のせいです。

"doSomething"は、私の一部の愚かな過失のために長い連鎖の一部であったが、何回も繰り返すことになり、正当な理由でアプリケーションにつながるメモリが不足しています。スタック変数を使用する場合でも、ヒープ上に配置されたmallocされたループを使用する場合でも、無限ループを使用すると、何らかの形でクラッシュする可能性があります。 :)

クラッシュは完全に公正です。ちょうどこのケースでは無関係であることが判明した以前の問題で混乱しました。みんなの時間を無駄にするための

申し訳ありません。

0

iOS 5とXcode 4.2を使用しているのを見て、XcodeでEdit>Refactor>Convert to Objective-C ARCに行って、あなたのメモリ管理の頭痛を和らげてください。

ARCはすべてのメモリ管理を行います。 deallocメソッドを保持、解放、または書く必要はありません。ほとんどの場合、メモリ管理について心配する必要はありません。あなたは謎のEXC_BAD_ACCESSの後ろにクラッシュするままにします。それが動作する方法は超効率的です。コンパイラは、あなたのための保持とリリースを入れてから最適化します。あなたはコードを見る必要はありません。

+0

問題は、静的に割り当てられたオブジェクトと純粋に自動リリースされたオブジェクトの両方に関係しており、カスタムリリースのものではありませんので、ARCが役立つかどうかは疑問です。私はそれが役立つ場合、いくつかのサンプルコードで質問を編集することができます。 –

1

我々は本当に全体のスタックトレースを見ずにあなたを助けることはできません。 EXC_BAD_ACCESSたちは例外が何であるかを知っておく必要があり、トラブルシューティングするためには何を意味するものではありません。 。あなたはそれはあなたがダブルリリースしているゾンビがあなたの二重のリリースを見つけるための方法であることを意味スタックtarceを取得しないとき、私の経験に基づいて

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

+0

私の答えを参照してください。私は今それを受け入れることができません、それは私が質問をして2日後に自分の答えを受け入れることができるか、そういうものです。 –

+0

そして、私が言及したように、ゾンビは、ヒープ上で宣言されたオブジェクトに適用可能です。私もSTACK変数で同じ問題に直面していたので、私の答えで明らかになったように、無限ループのx回の繰り返しの後にアプリがメモリ不足に陥っていたのと同じくらい、保持/解放の問題ではありませんでした。 –

関連する問題