Параметр userInfo
должен быть объектом; набрано id
. YES
является примитивом, а именно значением 1
. Чтобы убедиться, что объект userInfo
не освобожден, таймер сохраняет его. Итак, когда вы прошли YES
, NSTimer делал [(id)YES retain]
. Попробуйте это в своем собственном коде и посмотрите, что произойдет. : -Р
Как указано в Документации , селектор, который вы передаете методу, должен иметь подпись
- (void)timerFireMethod:(NSTimer*)theTimer
Это означает, что вы не можете заставить NSTimer вызывать какой-либо метод - по крайней мере, напрямую. Вы можете создать специальный метод с указанной выше сигнатурой, который, в свою очередь, вызывает любой метод, который вы хотите.
Итак, скажем, у вас есть метод с именем refresh:
, и вы хотите вызывать его время от времени, передавая YES
. Вы можете сделать это так:
// somewhere
{
[NSTimer scheduledTimerWithTimeInterval:refreshInterval
target:self
selector:@selector(invokeRefresh:)
userInfo:nil
repeats:YES];
}
- (void)invokeRefresh:(NSTimer *)timer {
[self refresh:YES];
}
- (void)refresh:(BOOL)flag {
if (flag) {
// do something
}
}