OSX 10.5.8ターゲット、32ビットおよびi386ビルド用のXCode3.1.1でのコンパイル。
NSWindowwloopとNSViewvloopで実行されているモーダル実行ループがあります。モーダルループが最初に開始されます。期待どおりに起動、実行、停止します。これが始まりです:
[NSApp runModalForWindow: wloop];
次に、ユーザーがマウスの左ボタンを押すと、次のようになります。
if (ticking == 0) // ticking is set to zero in its definition, so starts that way
{
ticking = 1; // don't want to do this more than once per loop
tickCounter = 0;
cuckCoo = [NSTimer scheduledTimerWithTimeInterval: 1.0f / 10.0f // 10x per second
target: self // method is here in masterView
selector: @selector(onTick:) // method
userInfo: nil // not used
repeats: YES]; // should repeat
}
呼び出しの戻りを確認すると、タイマーオブジェクトが取得され、期待どおりにタイマー呼び出しが行われたことを確認できます。
これで、ドキュメントによると、「cuckCoo」としてグローバルに保存された結果のNSTimerは、現在の実行ループに自動的に追加されるはずです。現在の実行ループは間違いなくモーダルループです。この時点では、他のウィンドウはロックアウトされており、意図したマウスアクションのあるウィンドウのみがメッセージを受信しています。
これが呼び出すメソッド「onTick」は非常に単純で(起動できないため)、vloopNSViewコードにあります。これはすべてが行われている場所です。
- (void) onTick:(NSTimer*)theTimer
{
tickCounter += 1;
NSLog(@"Timer started");
}
次に、モーダルループを停止するとき(これは正常に機能します)、次のようにします。
[cuckCoo invalidate];
[NSApp stop: nil];
ticking=0;
cuckCoo = NULL;
NSLog(@"tickCounter=%ld",tickCounter);
tickingとtickCounterはどちらもグローバルlongです。
onTick内からNSLogメッセージを取得できません。また、runloopの終了時にNSLogによって報告されるように、tickCounterはゼロのままです。
これはすべてコンパイルされ、正常に実行されます。ダニが出ることはありません。私は完全に途方に暮れています。何かアイデアはありますか?