我正在使用一个调用此方法的基本计时器:
- (void) refresh:(id)obj
{
if (obj == YES) doSomething;
}
我想从代码的某些区域以及计时器调用此方法
[NSTimer scheduledTimerWithTimeInterval:refreshInterval
target:self
selector:@selector(refresh:)
userInfo:nil
repeats:YES];
当我将 YES
作为 userInfo
参数的参数时,我收到 EXC_BAD_ACCESS
错误;这是为什么?
有人可以帮助我以正确的方式做到这一点,这样就不会出现难看的选角之类的情况吗?
最佳答案
userInfo
参数必须是一个对象;它的类型是id
。 YES
是一个原语,即值1
。为了确保 userInfo
对象不会被释放,计时器会保留它。因此,当您传递 YES
时,NSTimer 正在执行 [(id)YES keep]
。在您自己的代码中尝试一下,看看会发生什么。 :-P
作为Documentation声明,您为方法提供的选择器必须具有签名
- (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
}
}
关于objective-c - 使用 NSTimer 传递原始参数的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3262268/