У меня возникли проблемы с запуском NSTimer, и я предположил, что это связано с многопоточными проблемами. Чтобы быть уверенным, что я правильно создавал таймер, я создал следующий тестовый код, и я поместил его в initWithNibName моего главного контроллера представления. К моему большому удивлению, он также не смог там стрелять.NSTimer никогда не срабатывает
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(timerTest:paramTwo:paramThree:)]];
NSString *a = @"a";
NSString *b = @"b";
NSString *c = @"c";
[invocation setArgument:&a atIndex:2]; //indices 0 and 1 are target and selector respectively, so params start with 2
[invocation setArgument:&b atIndex:3];
[invocation setArgument:&c atIndex:4];
[[NSRunLoop mainRunLoop] addTimer:[NSTimer timerWithTimeInterval:5 invocation:invocation repeats:NO] forMode:NSDefaultRunLoopMode];
Любые подсказки о том, что не так с этим кодом? Кажется, что именно то, что в документации указано для использования NSInvocation с NSTimer.
я был под впечатлением, что метод подпись содержала информацию о целевой и селекторе; если нет, какова его цель? – Regan
Нет. Подписи методов - это всего лишь строка, описывающая формат селектора и немного бесполезной информации о выравнивании аргументов в стеке. Для NSInvocation это требуется, чтобы заставить механизм пересылки сообщений работать в случае сбоя вызова на исходном целевом объекте. – CodaFi