如果我有一个视图,其中performSelector设置为在延迟后触发:
[self performSelector:@selector(generateBall) withObject:NULL afterDelay:1.5];
Run Code Online (Sandbox Code Playgroud)
...但是我在选择器触发之前删除了查看该视图(例如,由于用户交互),然后我的应用程序崩溃了.
有没有办法在该视图的dealloc方法中终止延迟选择器?
编辑:
我试过了两个:
[[NSRunLoop mainRunLoop] cancelPerformSelector:theBall target:self argument:nil];
Run Code Online (Sandbox Code Playgroud)
和
[[NSRunLoop currentRunLoop] cancelPerformSelector:theBall target:self argument:nil];
Run Code Online (Sandbox Code Playgroud)
虽然两者都工作(允许我加载一个新的视图),加载上一个视图最终给我一个灰色的屏幕.
除了列出的那些Apple文档之外,我还没有找到任何有关cancelPerformSelector的教程或其他信息,并且关于线程和运行循环的文档似乎非常复杂(主要是因为它们没有列出工作代码示例,会让我更容易介入并理解发生的事情).
Jef*_*ume 15
因为我正在使用performSelector:afterDelay,我能够正确"杀死"任何先前请求但未启动的功能的唯一方法是使用:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:theBall object:nil];
Run Code Online (Sandbox Code Playgroud)
下面的代码示例演示了它是如何工作的(创建一个名为"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
Run Code Online (Sandbox Code Playgroud)