3

我正在使用 aNSTimer来运行动画(现在只需调用它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”而终止应用程序,原因:'-[SecondViewController myMethod:] : 无法识别的选择器发送到实例 0x4b2ca40'

那么我在这里做错了什么?

4

4 回答 4

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

希望这可以帮助某人。

于 2015-01-17T16:51:41.363 回答
4

要么你只能使用

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

或者您可以这样做(从方法名称中删除 : )..

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

希望对你有帮助

于 2012-06-21T19:55:30.110 回答
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];
于 2012-06-21T19:29:23.857 回答
2

计时器的操作方法应采用一个参数

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

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

当前,计时器将消息发送myMethod:到您的对象;您的对象不响应(但会响应myMethod)并引发异常。

于 2012-06-21T19:50:02.067 回答