我正在使用一个调用此方法的基本计时器:
- (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
错误;为什么是这样?
有人可以帮助我以正确的方式做到这一点,这样就不会有丑陋的选角之类的吗?
The userInfo
参数必须是一个对象;它被输入id
. YES
是一个原语,即值1
。为了确保userInfo
对象不会被释放,计时器会保留它。所以,当你通过YES
, NSTimer 正在做[(id)YES retain]
。在您自己的代码中尝试一下,看看会发生什么。 :-P
As the 文档 http://developer.apple.com/iphone/library/documentation/cocoa/reference/foundation/Classes/NSTimer_Class/Reference/NSTimer.html#//apple_ref/occ/clm/NSTimer/scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:状态,你给方法的选择器必须有签名
- (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
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)