2017-02-10 5 views
0

に割り当て解除された 'NSThread'オブジェクト(ゾンビ)にObjective-Cメッセージが送信されましたEXC_BAD_ACCESSのためにthis answerに従っています。はい、私はゾンビオブジェクトを持っています。私のコードのどの行が間違っているかを調べようとしているとき、責任ある図書館のすべてが財団であることがわかりました。私はこれをやろうとしているアドレス:

Like this

はあなたが任意の保持/解放をダブルクリックし、楽器はあなたにこれが実行されたコードの行が表示されます。

アセンブリ言語では、常にいくつかのコードが必要になります。

[assembly language (maybe?)[3]

私はこのような私のバグを追跡する方法がわからない... Elikeの答えに応じて

を更新。

ボタンのタイトルを更新するとバグが発生しました。私はタイマーを使用して1秒あたりのボタンのタイトルを更新します。ボタンをタップして開始/停止することができます。そして私はdispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(_auto_duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{});を使ってメソッドを300回自動実行します(このバグは300回の間にランダムに発生します)。

私はこの _startcounttimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(StartCountTimerMethod) userInfo:nil repeats:YES];

- (void)StartCountTimerMethod 
{ 
    _startcountbtnsec++; 
    NSString *secstring = [NSString stringWithFormat:@"%d", _startcountbtnsec]; 
    [_startbtn setTitle:secstring forState:UIControlStateNormal]; 
} 

のようにタイマーを呼び出すボタンをタップするには、このメソッドを呼び出します:

- (void)StartBtnClick:(UIButton *)btn 
{ 
    switch (btn.tag) { 
     case 0: 
      btn.tag = 1; 
      [_startbtn setTitle:@"0" forState:UIControlStateNormal]; 
      _startcountbtnsec = 0; 
      [self StartCountTimerStart]; 
      NSLog(@"Start!"); 
      break; 

     case 1: 
      btn.tag = 0; 
      [_startbtn setTitle:@"Start" forState:UIControlStateNormal]; 
      [self StartCountTimerStop]; 
      NSLog(@"Stop!"); 
      break; 

     default: 
      break; 
    } 
} 

私はボタンのテキストを更新するに問題を見ることができません...そしてゾンビオブジェクトは "NSThread"です。バグがボタンとスレッドについてある可能性はありますか?

+0

難しいです。クラッシュ自体は診断的なものであることに留意してください。実際の間違いはずっと前に起こった。だから、はい、メッセージがゾンビに送られた時点では、あなたのコードではありません。しかし、あなたのコードは、以前の状況を設定します。あなたは後方に努力する必要があります。 – matt

+0

まあ、私も同様の状況にあったし、確かに、基礎図書館に問題はないと言える。静的アナライザを実行してみてくださいhttps://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/debugging_with_xcode/chapters/static_analyzer.html(これは問題を解決しません、最初のステップになります)潜在的なメモリを確認してくださいリーク –

+0

私は静的アナライザーを実行しましたが、潜在的なメモリリークはありません。 – Chien

答えて

1

私はそれが時々簡単にちょうどスキームの診断でゾンビを有効にするために見つける:あなたの最初のスクリーンショットでゾンビを探しBreak on EXC_BAD_ACCESS in XCode?

はかなり明白ですが、私は実際の出力があまりにも一般的なもので同意するものとします。 あなたのアプリが何であるか分かりませんが、通知に基づいてボタンのテキストを更新する場所を探しています。

+0

はい、私はボタンのタイトルを毎秒更新するためにタイマーを使用します。ボタンをタップして開始/停止することができます。ボタンテキスト_コードを_updateするための私の質問を編集しました。たぶん私はそれらをメインスレッドに配置する必要がありますか? – Chien

+0

@Chienこれが問題なのかどうかは分かりませんが、メインスレッドのUIを常に更新する必要があります。 – halileohalilei

+0

うん。私は確信していません。メインスレッドでUIを更新しなかった場合は、メソッドを呼び出すたびにクラッシュするはずです。しかし、それはランダムに起こります。 – Chien