Objective c 使用NSTimer传递基元参数的正确方法
我正在使用一个调用此方法的基本计时器:Objective c 使用NSTimer传递基元参数的正确方法,objective-c,cocoa,cocoa-touch,nstimer,Objective C,Cocoa,Cocoa Touch,Nstimer,我正在使用一个调用此方法的基本计时器: - (void) refresh:(id)obj { if (obj == YES) doSomething; } 我想从代码的某些区域以及计时器调用此方法 [NSTimer scheduledTimerWithTimeInterval:refreshInterval target:self selector:@selector(ref
- (void) refresh:(id)obj
{
if (obj == YES) doSomething;
}
我想从代码的某些区域以及计时器调用此方法
[NSTimer scheduledTimerWithTimeInterval:refreshInterval
target:self
selector:@selector(refresh:)
userInfo:nil
repeats:YES];
当我把YES
作为userInfo
参数的参数时,我得到一个EXC\u BAD\u ACCESS
错误;为什么会这样
有人能帮我用正确的方法来做这件事吗,这样就不会有难看的施法等等?用户信息参数必须是一个对象;它是键入的
id
YES
是一个原语,即值1
。为了确保userInfo
对象未被解除分配,计时器将保留该对象。因此,当您通过YES
时,NSTimer正在执行[(id)YES retain]
。在您自己的代码中尝试一下,看看会发生什么-P
作为状态,您给方法的选择器必须具有签名
- (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
}
}
作为kperryua回答的后续步骤,如果您想通过userInfo传递原语,可以使用
NSNumber
或NSValue
将其框起来;对于布尔值,您需要使用[NSNumber numberWithBool:YES]
,然后在计时器回调中调用boolValue
,以返回原语。在Objective-C中,原语类型不是对象。因此,不能直接将其传递给需要id
的参数,该id表示泛型对象。您需要将其包装到NSNumber
对象中
使用
及
完成后,不要忘记使计时器失效并释放计时器
顺便说一下,你不必把<代码> BoOL <代码>(或C++ <代码> Boo< <代码>)与<代码> > < <代码> >或>代码>真< /代码>或其他什么比较。当你写作时
if(a>b) { ... }
a>b
计算为bool,如果if
使用结果。你在那里做的就像
if((a>b)==YES) { ... }
这对我来说很奇怪。这并不是说if
之后的(..)
应该包含一个比较;它应该包含一个bool
if(a>b) { ... }
if((a>b)==YES) { ... }