1

私はかなり奇妙な問題を抱えています。短くするために、いくつかの擬似コードを記述します。

init: create a dictionary and insert n elements.
      create a "repeat timer" and add it to the currentRunLoop using the timerRefresh selector.

timerRefresh: using a list of keys, find the items in the dictionary
              if the item exists -> call a function

したがって、不明な理由で、次の場合にEXC_BAD_ACCESSを取得します。

    [item function];

しかし、辞書の項目から取得したアドレスをトレースしたところ、問題ありません。ディクショナリ内のアイテムの参照カウントはまだ1です。ディクショナリ内のアイテムの{release、dealloc}は呼び出されません。すべてが順調に見えます。また、最悪の場合、一部のアイテムで機能します。

それで、私は糸脱毛の問題があるかどうか疑問に思っていますか?または何か他のあいまいな?

コールスタックは非常に単純です。

#0  0x93e0604b in objc_msgSend_fpret
#1  0x00f3e6b0 in ??
#2  0x0001cfca in -[myObject timerRefresh:] at myObject.m:000
#3  0x305355cd in __NSFireTimer
#4  0x302454a0 in CFRunLoopRunSpecific
#5  0x30244628 in CFRunLoopRunInMode
#6  0x32044c31 in GSEventRunModal
#7  0x32044cf6 in GSEventRun
#8  0x309021ee in UIApplicationMain
#9  0x000027e0 in main at main.m:14

だから、どこを見るべきか提案をいただければ幸いです。

---編集#1---

@Laurent:私の例に一致するように実際の値を書き直すのはタイプミスです。(修繕)

@ジェレミー:私は助けるためにいくつかのコードを投稿しようとします。コードが簡略化されました。

タイマー初期化+更新機能:

_refreshTimer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:5] interval:5
                                 target:self selector:@selector(onTimerRefresh:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_refreshTimer forMode:NSDefaultRunLoopMode];

//...

 (void)onTimerRefresh:(NSTimer*)theTimer {
      // the actual code is here. I will rewrite it so it's simpler:
     for (MyKey key in keys) {
         MyObject* object = [dictionary objectForKey:key];
         if (object)
             [object function];
     }
 }

もう少しはっきりしているといいのですが。

そうです、「関数」のすべてにコメントしましたが、クラッシュしないようです。もう少し実行させますが、その機能(メモリ関連)で特別なことは何もしていません。いくつかの列挙値を更新するだけです。

---編集#2---

@Laurent:あなたはcallstakについて正しいです、私は大きな間違いを犯しました。関数ではなく、タイマー方式である必要があります。修正するだけです。間違いでごめんなさい。ただし、参考までに、メソッドのシグネチャは次のとおりです。

- (bool)update;
4

1 に答える 1

0

私はついに何が問題だったのかを見つけたと思います。メソッド「更新」で

- (bool)update {
    // ...
    NSDate* now = [NSDate dateWithTimeIntervalSinceNow:0];
    NSTimeInterval interval = [now timeIntervalSinceNow] - [creation timeIntervalSinceNow];
    //...
}

問題は、initの日付(作成)で保持を行わなかったことです。オブジェクトが「破損」した理由はよくわかりませんが、デバッガーは関数呼び出しではなく、その変数を指定する必要があったと思います...

アプリケーションをしばらく実行して、クラッシュがなくなったかどうかを確認します。

助けてくれてありがとう。

于 2010-05-27T15:36:26.150 に答える