0

我正在尝试使用 aNSTimer来调用类的超类中的函数。

如果我这样称呼它,该功能将起作用:

[super playNarrationForPage:[NSNumber numberWithInt:1]];

但如果我这样做:

NSTimer *narrationTimer = [NSTimer scheduledTimerWithTimeInterval:7.5
                                                           target:self.superclass
                                                           selector:@selector(playNarrationForPage:) 
                                                           userInfo:[NSNumber numberWithInt:1] 
                                                           repeats:NO
                          ];

我收到此错误:unrecognized selector sent to class 0x106890 2012-07-06 21:14:59.522 MyApp[19955:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[MyBaseClass playNarrationForPage:]: unrecognized selector sent to class 0x106890'

我尝试设置super为,target:但我被告知“使用未声明的超级标识符”。有什么想法吗?

4

3 回答 3

9

由于self.superclass返回一个Class对象,它绝对不是你想要的。

此外,您似乎不了解 an 如何NSTimer调用其目标。您正在使用 anNSNumber作为计时器userInfo,并且您的playNarrationForPage:方法似乎需要一个NSNumber参数。但是 an在调用其目标时不会将其作为NSTimer参数传递userInfo自身作为参数传递,如下所示NSTimer

// self is the NSTimer object here!
[self.target performSelector:self.selector withObject:self];

必须为计时器创建一个新方法才能调用。这个新方法需要将计时器作为其参数,如下所示:

- (void)narrationTimerDidFire:(NSTimer *)timer {
    [self playNarrationForPage:timer.userInfo];
}

然后,您需要在创建计时器时使用该选择器:

NSTimer *narrationTimer = [NSTimer scheduledTimerWithTimeInterval:7.5
    target:self
    selector:@selector(narrationTimerDidFire:)
    userInfo:[NSNumber numberWithInt:1]
    repeats:NO];

如果你真的想narrationTimerDidFire:打电话[super playNarrationForPage:],编译器会让你。但是这样做很可疑。如果您没有playNarrationForPage:在子类中覆盖,那么没有理由super直接引用;您的子类继承其超类的playNarrationForPage:方法。如果您在子类重写playNarrationForPage:了它,那么从计时器的回调中绕过它表明您的设计有问题。

于 2012-07-06T20:28:05.993 回答
5

您应该使用的唯一super时间是当您在一个方法中并且想要调用超类的同一方法的实现时(包括间接 - 见下文)。

self.superclass作为计时器的目标没有意义,除非您的目标是调用超类上的类方法。

只需self用作目标。如果这不起作用,因为您正在重写playNarrationForPage:并希望将调用延迟到 super,然后创建一个单独的方法,该方法执行以下操作:

- (void) _delayedDoIt
{
     [super playNarrationForPage:1];
}

playNarrationForPage:并通过计时器从自己的实现中调用它。

于 2012-07-06T20:26:15.807 回答
4

您不能直接告诉它调用该super方法。target只是一个指向对象的指针,与您的实例super没有单独的指针地址。self

此外,通过分配target给您,self.superclass您正在告诉target要成为班级。因此,您尝试调用类方法而不是实例方法,这不是您想要做的。

这样做的唯一方法是将目标分配给self并具有单独的方法,例如:

- (void)callSuperMethod
{
    [super playNarrationForPage:[NSNumber numberWithInt:1]];
}
于 2012-07-06T20:27:44.097 回答