Objective c 如何使super成为NSTimer的目标?

Objective c 如何使super成为NSTimer的目标?,objective-c,ios,nstimer,Objective C,Ios,Nstimer,我试图使用NSTimer调用类的超类中的函数 如果我这样调用该函数,它将工作: [super playNarrationForPage:[NSNumber numberWithInt:1]]; 但如果我这样做: NSTimer *narrationTimer = [NSTimer scheduledTimerWithTimeInterval:7.5 target:self.su

我试图使用
NSTimer
调用类的超类中的函数

如果我这样调用该函数,它将工作:

[super playNarrationForPage:[NSNumber numberWithInt:1]];
但如果我这样做:

NSTimer *narrationTimer = [NSTimer scheduledTimerWithTimeInterval:7.5
                                                           target:self.superclass
                                                           selector:@selector(playNarrationForPage:) 
                                                           userInfo:[NSNumber numberWithInt:1] 
                                                           repeats:NO
                          ];
我收到此错误:
无法识别的选择器被发送到类0x106890
2012-07-06 21:14:59.522 MyApp[19955:707]***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+[MyBaseClass PlayStationForPage:::未识别的选择器发送到类0x106890”

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

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

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

只需使用
self
作为目标。如果由于您正在重写
PlayStationForPage:
并希望延迟对super的调用而无法使用,请创建一个单独的方法,执行以下操作:

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

并通过计时器从self的
PlayStationForPage:
实现中调用它。

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

另外,通过将
target
分配给
self.superclass
您告诉
target
为类。因此,您试图调用一个类方法,而不是一个实例方法,这不是您想要做的

唯一的方法是将目标分配给
self
,并使用单独的方法,例如:

- (void)callSuperMethod
{
    [super playNarrationForPage:[NSNumber numberWithInt:1]];
}

因为
self.superclass
返回一个
Class
对象,所以它肯定不是您想要的

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

// self is the NSTimer object here!
[self.target performSelector:self.selector withObject:self];
- (void)narrationTimerDidFire:(NSTimer *)timer {
    [self playNarrationForPage:timer.userInfo];
}
必须为计时器创建一个新的调用方法。此新方法需要将计时器作为其参数,如下所示:

// 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];
如果您真的想进行
叙述timerdfire:
调用
[super playStationforPage:
,编译器将允许您。但是这样做是非常可疑的。如果您没有在子类中重写
PlayStationForPage:
,那么就没有理由直接引用
super
;您的子类继承其超类的
PlayStationForPage:
方法。如果您在子类中重写了
PlayStationForPage:
,那么从计时器的回调中绕过它表明您的设计有问题