-1

我正在创建一个创建计时器的类,然后使用@selector 或(SEL)调用 void。应用程序在 [mytimer timer…] 时崩溃;被调用是因为“调用了未知的选择器”。错误是它没有找到我给它的空隙,但我知道空隙工作正常。我的问题是如何正确编写 myselector 部分?

+ (void) timer:(NSTimer*)timer interval:(int)interval selector:(SEL)myselector   
{
timer = [NSTimer scheduledTimerWithTimeInterval:interval
                                         target:self
                                       selector:myselector
                                       userInfo:nil
                                        repeats:YES];
}

这是正在实现的方法:

[mytimer timer:NameOfTimerTheWorks interval:0.1 selector:@selector(myVoid)];

... 

- (void)myVoid
{
Do stuff
}

我也知道这个类看起来完全没用,但我没有包含更多内容。我的问题围绕着选择器。

4

2 回答 2

2

您使用@selector() 没有任何问题,您的问题在于Objective C 类,以及self在不同范围内的含义。

问题是您在类+方法中创建计时器self,此时不是您想要的实例,它实际上是Class它本身。我不会在类方法中这样做,但如果你必须这样做,只需传入对目标的引用,它就会发送你期望的消息。

将您的实现更改为以下内容,以便传入目标并返回计时器

+ (NSTimer *)timerWithTarget:(id)target 
     interval:(int)interval 
     selector:(SEL)myselector   
{
  return [NSTimer scheduledTimerWithTimeInterval:interval
                                           target:target
                                         selector:myselector
                                         userInfo:nil
                                          repeats:YES];
}


NameOfTimerTheWorks = [mytimer timetWithTarget:self interval:0.1 selector:@selector(myVoid)];

- (void)myVoid
{
  //Do stuff
}

此外,在 Objective C 中,命名类的标准方法是使用大写字母,并在适当的情况下使用驼峰式命名。您的课程应该是MyTimer而不是mytimer,并且 iVars 是小写的,例如nameOfTimerTheWorks

于 2012-08-07T22:55:42.130 回答
0

我认为问题在于您正在尝试使用类级别方法访问实例级别方法。

我将 + 更改为 - 以便它是实例级方法。

如果您希望您的方法是类级别的,则需要您将要调用的方法也设置为类级别。

- /* <-- + */(void) timer:(NSTimer*)timer interval:(int)interval selector:(SEL)selector   
{

    timer = [NSTimer scheduledTimerWithTimeInterval:interval
                                         target:self
                                       selector:selector
                                       userInfo:nil
                                        repeats:YES];

}
于 2012-08-07T23:09:32.190 回答