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:
,那么从计时器的回调中绕过它表明您的设计有问题