NSTimer在触发时导致“无法识别的选择器”崩溃

时间:2012-06-21 19:24:37

标签: objective-c ios selector nstimer

我正在使用NSTimer来制作动画(现在只需将其称为myMethod)。然而,它导致了崩溃。

以下是代码:

@implementation SecondViewController


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.


- (void) myMethod
{
    NSLog(@"Mark Timer Fire");

}


- (void)viewDidLoad
{ 
[super viewDidLoad];



NSLog(@"We've loaded scan");

[NSTimer scheduledTimerWithTimeInterval:2.0
                                 target:self
                               selector:@selector(myMethod:)
                               userInfo:nil
                                repeats:YES];

animationTimer = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(myMethod:) userInfo:nil repeats: YES];


}

这是崩溃期间的输出

  

- [SecondViewController myMethod:]:无法识别的选择器发送到实例0x4b2ca40   2012-06-21 12:19:53.297 Lie Detector [38912:207] * 由于未捕获的异常'NSInvalidArgumentException'而终止app,原因:' - [SecondViewController myMethod:]:无法识别的选择器发送到实例0x4b2ca40'

那我在这里做错了什么?

4 个答案:

答案 0 :(得分:5)

我在使用Swift时遇到了这个问题。在Swift中我发现NSTimer的目标对象必须是NSObject可能并不明显。

class Timer : NSObject {
   init () { super.init() }
   func schedule() {
      NSTimer.scheduledTimerWithTimeInterval(2.0,
                             target: self,
                             selector: "myMethod",
                             userInfo: nil,
                            repeats: true)
  }
  func myMethod() {
     ...
  }
}

希望这有助于某人。

答案 1 :(得分:4)

要么只能使用

- (void)myMethod: (id)sender
{
 // Do things
}

或者你可以(从方法名称中删除:)..

animationTimer = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(myMethod) userInfo:nil repeats: YES];

希望这会对你有所帮助

答案 2 :(得分:3)

替换此

[NSTimer scheduledTimerWithTimeInterval:2.0
                             target:self
                           selector:@selector(myMethod:)
                           userInfo:nil
                            repeats:YES];

由此

[NSTimer scheduledTimerWithTimeInterval:2.0
                             target:self
                           selector:@selector(myMethod)
                           userInfo:nil
                            repeats:YES];

答案 3 :(得分:2)

计时器的操作方法should take one argument

- (void)myMethod: (NSTimer *)tim
{
     // Do things
}

此方法的名称为myMethod:,包括冒号。您当前方法的名称为myMethod没有冒号,但您可以通过传递包含它的方法名称来创建计时器:selector:@selector(myMethod:)

目前,计时器会将消息myMethod:发送给您的对象;

,你的对象没有响应(但会响应myMethod)并引发异常。