2013-07-30 3 views
1

У меня возникли проблемы с запуском 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.

ответ

3

NSInvocations также должен иметь цель и селектор в дополнении к сигнатуре методы и аргументам:

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]; 
[invocation setTarget:self]; 
[invocation setSelector:@selector(timerTest:paramTwo:paramThree:)]; 
[[NSRunLoop mainRunLoop] addTimer:[NSTimer timerWithTimeInterval:1 invocation:invocation repeats:NO] forMode:NSDefaultRunLoopMode]; 
+0

я был под впечатлением, что метод подпись содержала информацию о целевой и селекторе; если нет, какова его цель? – Regan

+1

Нет. Подписи методов - это всего лишь строка, описывающая формат селектора и немного бесполезной информации о выравнивании аргументов в стеке. Для NSInvocation это требуется, чтобы заставить механизм пересылки сообщений работать в случае сбоя вызова на исходном целевом объекте. – CodaFi

Смежные вопросы