Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用NSTimer传递基元参数的正确方法_Objective C_Cocoa_Cocoa Touch_Nstimer - Fatal编程技术网

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) { ... }