У меня есть этот код.Не удается получить доступ к пользовательской информации NSTimer
- (void)scheduleTimerAfterDelay:(NSTimeInterval)delay {
dispatch_async(dispatch_get_main_queue(), ^{
_timer = [NSTimer scheduledTimerWithTimeInterval:delay
target:self
selector:@selector(triggerTimer:)
userInfo:[NSString stringWithFormat:@"%f", delay]
repeats:NO];
});
}
- (void)triggerTimer:(NSTimer *)timer {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Triggered timer after %@ s.", _timer.userInfo); // <-- Exception thrown!
// Do stuff
});
}
Но когда спусковой таймер, _timer.userInfo
вызывает Exception: EXC_BAD_ACCESS (code=1, address=0xc))
.
Что я пропустил здесь? Печать _timer в точке останова в строке исключения показывает, что _timer равен <__NSCFTimer: 0x14ec8cb0>
. Но я не могу получить доступ к userInfo через lldb. Я использую ARC.
В документации указано, что оно должно быть id. https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/classes/NSTimer_Class/Reference/NSTimer.html#//apple_ref/occ/instm/NSTimer/userInfo Несмотря на это, его изменение в словарь не изменяет результат. – MdaG
@MdaG Я обновил свой ответ. Вам также потребуется получить доступ к нему в качестве словаря. – trojanfoe
Проблема заключается в том, что таймер запускает «triggerTimer» на mainThread, и вы снова просите отправить на maintherad. Поэтому отправленные работы будут выполняться на следующем runLoop. Но объект таймера действителен только для этой Runloop. – chandu