通过选择器调用方法

时间:2013-01-25 16:47:52

标签: objective-c parameter-passing selector

我在目标C中写了一个函数。 这就是我得到的:

int rndValue = (((int)arc4random()/0x100000000)*width);
timer1 = [NSTimer scheduledTimerWithTimeInterval:.01 
                                          target:self 
                           [self performSelector:@selector(doItAgain1:)  
                                      withObject:rndValue] 
                                        userInfo:nil
                                         repeats:YES];

选择器调用此方法并传递参数:

-(void)doItAgain1:(int)xValuex{
}

在此阶段,顶级代码会产生语法错误。 Syntax error: 'Expected ] before performSelector'概率是多少? 最好的问候

2 个答案:

答案 0 :(得分:2)

该行应该可以阅读

timer1 = [NSTimer scheduledTimerWithTimeInterval:.01 
         target:self selector:@selector(doItAgain1:) 
         userInfo:nil repeats:YES];

你不能用这个调用发送一个方法参数,为了做到这一点,你必须做一些事情:

NSInvocation *inv = [NSInvocation invocationWithMethodSignature:
    [self methodSignatureForSelector:@selector(doItAgain1:)]];

[inv setSelector:@selector(doItAgain1:)];
[inv setTarget:self];
[inv setArgument:&rndValue atIndex:2];

timer1 = [NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval).01 
         invocation:inv 
         repeats:YES];

答案 1 :(得分:1)

这样更正确:

[NSTimer scheduledTimerWithTimeInterval:.01 target:self 
                 selector:@selector(doItAgain1:)
                 userInfo:[NSNumber numberWithInt:rndValue] repeats:YES];

另请注意,以这种方式调用的选择器的语法必须是:

- (void)doItAgain1:(NSTimer*)timer {

   int rndValue = [timer.userInfo intValue];
   ...
}

无法为这样的计时器选择器指定int参数,因此可以将其转换为NSNumber对象。