因为我正在使用 performSelector:afterDelay,所以我能够正确“杀死”任何先前请求但未启动的功能的唯一方法是使用:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:theBall object:nil];
以下代码示例展示了它是如何工作的(创建一个名为“select”的新 View 模板 XCode 项目,并将 selectViewController.h 文件替换为此):
#import "selectViewController.h"
@implementation selectViewController
UILabel *lblNum;
UIButton *btnStart, *btnStop;
int x;
- (void) incNum {
x++;
lblNum.text = [NSString stringWithFormat:@"%i", x];
[self performSelector:@selector(incNum) withObject:NULL afterDelay:1.0];
}
- (void) stopCounter {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(incNum) object:NULL];
}
- (void)viewDidLoad {
x = 0;
lblNum = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
lblNum.textAlignment = UITextAlignmentCenter;
[self.view addSubview:lblNum];
btnStart = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btnStart.frame = CGRectMake(40, 270, 240, 30);
[btnStart setTitle:@"start" forState:UIControlStateNormal];
[btnStart addTarget:self action:@selector(incNum) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnStart];
btnStop = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btnStop.frame = CGRectMake(40, 310, 240, 30);
[btnStop setTitle:@"stop" forState:UIControlStateNormal];
[btnStop addTarget:self action:@selector(stopCounter) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnStop];
[self performSelector:@selector(incNum) withObject:NULL afterDelay:1.0];
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
}
- (void)dealloc {
[lblNum release];
[super dealloc];
}
@end