Компиляция в XCode 3.1.1 для целевой OSX 10.5.8, 32-разрядной версии и сборки i386.
У меня есть модальный цикл выполнения, работающий в NSWindow wloop и NSView vloop. Модальный цикл запускается первым. Он запускается, работает и останавливается, как и ожидалось. Вот начало:
[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
}
Проверяя возврат вызова, я получаю объект таймера и могу подтвердить, что вызов таймера сделан, когда я этого ожидаю.
Теперь, согласно документации, результирующий NSTimer, хранящийся глобально как cuckCoo, должен быть автоматически добавлен в текущий цикл выполнения. Текущий цикл выполнения определенно является модальным - в это время другие окна заблокированы, и только окно с предполагаемым действием мыши принимает сообщения.
Вызываемый при этом метод onTick очень прост (потому что я не могу заставить его активироваться), он находится в коде vloop NSView, в котором все это происходит:
- (void) onTick:(NSTimer*)theTimer
{
tickCounter += 1;
NSLog(@"Timer started");
}
Затем, когда пришло время остановить модальный цикл (который, кстати, работает нормально), я делаю следующее:
[cuckCoo invalidate];
[NSApp stop: nil];
ticking=0;
cuckCoo = NULL;
NSLog(@"tickCounter=%ld",tickCounter);
ticking и tickCounter - это глобальные длинные позиции.
Я не получаю сообщение NSLog из onTick, а значение tickCounter остается равным нулю, как сообщает NSLog в конце цикла выполнения.
Все это компилируется и работает нормально. У меня просто никогда не бывает клещей. Я в полной растерянности. Есть идеи, кто-нибудь?