2012-02-08 7 views
6

私はアイデアが不足しています。私はARCを使ってプロジェクトにEXC_BAD_ACCESSを受け取ります。デバッガによれば、それはmain()の範囲内です。 NSZombieEnabledはYESに設定されていますが、コールスタックやクラス/タイプなどは表示されません。インスペクタ/プロファイルでも同じです。私が得るのは、アプリケーションがクラッシュした後、しばらくの間、「セッションタイムアウト」です。ARCでmain()内のEXC_BAD_ACCESSがエラーにヒントがありません

私のコード内で見つけるのは難しいです。

私は、すべてのメソッドのentyと終了時に自分のコードの上に

NSLog(@"CrashLog: <%@:%@:%d:%s>", NSStringFromClass([self class]), 
NSStringFromSelector(_cmd), __LINE__, __FILE__); 

のようなトレースを設定していますが、私はまだ任意の有用なパターンを識別しませんでした。私が見ることができるのは、EXC_BAD_ACCESSがスローされたときに、問題のすべてのメソッドが既に残っているということです。

問題を特定する方法はありますか?

Timはgdbでバックトレース(bt)を使用することを提案しました。結果は次のとおりです。

#0 0x0be87580 in TI::Favonius::BeamSearch::choose_hit_test_node() 
#1 0x0be87b5f in TI::Favonius::BeamSearch::update_for_touch() 
#2 0x0be8ee32 in TI::Favonius::StrokeBuildManager::update_search_for_touch() 
#3 0x0be8f58f in TI::Favonius::StrokeBuildManager::key_down_or_drag_hit_test_for_UI() 
#4 0x0be6ba8b in TIInputManagerZephyr::simulate_touches_for_input_string() 
#5 0x0be7e5d9 in -[TIKeyboardInputManagerZephyr candidates]() 
#6 0x00678345 in -[UIKeyboardImpl generateAutocorrectionReplacements:]() 
#7 0x007dcaec in __71-[UITextInteractionAssistant scheduleReplacementsForRange:withOptions:]_block_invoke_0() 
#8 0x007f6db2 in -[UITextSelectionView calculateAndShowReplacements:]() 
#9 0x00e255fd in __NSFireDelayedPerform() 
#10 0x01a03976 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__() 
#11 0x01a03417 in __CFRunLoopDoTimer() 
#12 0x019667e0 in __CFRunLoopRun() 
#13 0x01965dd4 in CFRunLoopRunSpecific() 
#14 0x01965ceb in CFRunLoopRunInMode() 
#15 0x01ccb879 in GSEventRunModal() 
#16 0x01ccb93e in GSEventRun() 
#17 0x0050d38b in UIApplicationMain() 
#18 0x000033e0 in main (argc=1, argv=0xbffff5fc) at /Users/Hermann/AppDev/fcApp/fcApp/main.m:16 

答えて

12

ARCでEXC_BAD_ACCESSを取得する方法はまだあります。あなたがオブジェクトを作成し、それが非同期バックあなたを呼び出して何かをしている場合は、私が

  1. に走ったことのいくつか - あなたはどこか、ARC、それへの参照を維持することを確認する必要があり、それを解放します。 UIImagePickerの例 - ローカルのイメージピッカー変数を作成して呼び出すだけでは呼び出せません。プロパティを作成して保持する必要があります。

  2. Ifあなたは常にそれを保持するためにプロパティを使用していない、あなたは問題に遭遇するかもしれない - ARCは強く弱いの存在を使用して何をすべきかを知っている - 代わりにivarを使用する場合は、ARC(100%これは確かです)。あなたがこれをしないことを確認する簡単な方法の1つは、プロパティとivarに同じ名前を付ける代わりに、@synthesize var = _varを使用することです。このようにして、self.var = objを忘れてvar = objを使用すると、それは不平を言います。

  3. 私はジェスチャーとタブのバグに遭遇した - IBによって追加のジェスチャーを保持していないタブのビューは - 私は、これらのケースのゾンビではここ

Crash when using gesture recognizers in StoryBoard

それを文書化助けてくれるはずです。そうでないと、おそらく早すぎてリリースが起こらないということです。おそらく、あなたはメモリを浪費しているでしょう - 私はすべてのキャストをチェックし、組み込みの配列や非オブジェクトポインタを使ってどこか外に出ていないことを確認します。ガードmalloc関数

https://developer.apple.com/library/ios/#documentation/Performance/Conceptual/ManagingMemory/Articles/MallocDebug.html

+0

ありがとうございました。私は非同期http要求でそれをやっています。ただし、要求しているオブジェクトのデバッグメソッド内で開いている接続をすべて取り消すことができます。しかし、私はダブルチェックします。 2のために:ありがとう。すべての関連するケースでself.varを使用していたかどうかをdoulbeで確認します。 3.私のアプリケーションには全く適用すべきではありません。しかし、あなたは "ガードmalloc"について少し具体的にすることができますか?これは私に知らせるニュースでも、あなたが何を意味しているのか分かりませんでした。 (英語は母国語ではありません)。これまでにありがとうございました。 –

+0

Guard Mallocヘルプのリンクに従ってください。ヒープは、問題に対してより敏感になります。 –

+0

これは直接helpfuではありませんでした。しかし、アドバイスに従うことでタイムリーなウィンドウが大幅に狭められました。アイデアがあれば根本的な原因を見つけるのがはるかに簡単です。あなたは素晴らしいブログを運営しています。 :) –

0

計測器(製品>プロファイル)でアプリを実行して、リークテンプレートを選択してください。それはあなたにエラーがどこにあるかのヒントを与えるかもしれません。 More information here

+0

申し訳ありませんが、私はすでにそれをしたことは言及していませんでした。とにかくありがとう。 –

0

を助けることができるあなたは例外ブレークポイントが設定されていないようですね。 Xcodeはデフォルトでは作成しません。ブレークポイントナビゲータ(cmd + 6)を開き、左下の+をクリックし、ポップアップメニューから "例外ブレークポイントの追加"を選択します。 「完了」をクリックすると、問題が発生している場所の近くで休憩することがわかります。

これがなければ、デバッガはmainにダンプすることがあります。そこにどのように到達したのかについてはスタックトレースにヒントはありません。

+0

ありがとうございます。あなたが正しいです。そうしようとします。 –

+1

いいえ、それ以上私をもたらすことはありませんでした。全く変化はありません。 –

1

いいえ、ついに私はそれを得ました。

どのディテールが間違っていたのかまだ分かりません。最後に、この問題はUITextViewに関連していることがわかりました。もともとテキストビューは編集可能ではありませんでした。しかし、私はタッチイベントを受け取りたいと思っていました。私はUITextViewのデリゲートとして「自己」(のUIViewControllerのサブクラス)を割り当てられ、かろうじてこのようにプロトコルをimplemeted (iPhone) How to handle touches on a UITextView?

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView{ 
    [self userShow:nil]; //Within this method a subsequent UIViewController subclass/object is created and pushed. 
    return FALSE; 
} 

- (BOOL)textViewShouldEndEditing:(UITextView *)textView{ 
    return TRUE; 
} 

- (void)textViewDidBeginEditing:(UITextView *)textView{ 
    return; 
} 

- (void)textViewDidEndEditing:(UITextView *)textView{ 
    return; 
} 


- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{ 
    return TRUE; 
} 

- (void)textViewDidChange:(UITextView *)textView{ 
    return; 
} 

- (void)textViewDidChangeSelection:(UITextView *)textView{ 
    return; 
} 

意図が実際に編集を避けるためだったので、私はhiereを与えられたよう提案の一つをfollwedユーザーがUITextViewの領域に触れ、何らかのアクションを呼び出すとイベントを受け取ります。この場合、後続のビューコントローラが作成され、ナビゲーションスタックにプッシュされました。それはうまくいきましたが、しばらくしてから、場合によっては数分(!)アプリがクラッシュしました。 Louの答えと彼のブログのおかげで、私はtextViewShouldBeginEditingの呼び出しにもっと近いEXC_BAD_ACCESSを得ることができました。 EXT_BAD_ACCESSの周りを回っているイーラーの難しい考え方と同様に、私はUITextViewをコメントアウトし、他のUIButton項目を使用して呼び出すビューコントローラを呼び出しました。 (ちょっと速いテンポラリの回避策) これは幸運にもこのトリックでした。アプリはもうクラッシュしなかった。今度は、同じユーザーエクスペリエンスをもたらすが、別のビューコントローラを別の方法で呼び出すという、より洗練された実装に移行する予定です。

他の人が同じ問題に遭遇した場合に備えて、私はこの回答を提供します。どのディテールで問題が発生したかについての説明がある場合は、ヒットが高く評価されます。

関連する問題