私はかなり奇妙な問題を抱えています。短くするために、いくつかの擬似コードを記述します。
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;