6

我已经启动了一个延迟线程,performSelector但用户仍然可以在当前视图上点击后退按钮,从而导致调用 dealloc。发生这种情况时,我的线程似乎仍然被调用,这导致我的应用程序崩溃,因为线程试图写入的属性已被释放。为了解决这个问题,我试图打电话cancelPreviousPerformRequestsWithTarget取消之前的请求,但它似乎不起作用。下面是一些代码片段。

- (void) viewDidLoad {
    [self performSelector:@selector(myStopUpdatingLocation) withObject:nil afterDelay:6];
}   

- (void)viewWillDisappear:(BOOL)animated {
        [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myStopUpdatingLocation) object:nil];
    }

我在这里做错了什么吗?该方法myStopUpdatingLocation在我调用执行请求的同一类中定义。

多一点背景。我试图实现的功能是找到用户位置,在谷歌搜索该位置周围的一些位置,并在地图上显示几个注释。在viewDidLoad我开始使用 更新位置CLLocationManager。如果我在超时内没有达到我想要的准确度,我会在 6 秒后建立超时,我正在使用 aperformSelector来执行此操作。可能发生的情况是用户单击视图中的后退按钮,即使我的所有属性都已释放导致崩溃,该线程仍将执行。

提前致谢!

詹姆士

4

2 回答 2

4

我发现了我的问题,它与我对 performSelector 的调用没有任何关系。我发现你必须在释放它们之前将你的 MKMapView 和 CLlocationManager 的 delgate 设置为 nil。否则,即使您已发布实例,它们仍将继续工作,并且它们有可能使您的应用程序崩溃。

感谢您的帮助诺亚!

于 2010-05-19T07:13:11.650 回答
2

我遇到了一个类似的问题,我不知道我在不同的对象上安排了多个 performSelector 调用,因此“自我”在每种情况下都是不同的。

我建议扔一个NSLog(@"Self: %@",self); 在您的每一段代码之前,例如:

- (void) viewDidLoad {
    NSLog(@"Self: %@",self); before
    [self performSelector:@selector(myStopUpdatingLocation) withObject:nil afterDelay:6];
}   

- (void) viewWillDisappear:(BOOL)animated {
    NSLog(@"Self: %@",self); before
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myStopUpdatingLocation) object:nil];
}

这将允许您比较 SELF 实例,以确保您在同一对象上执行和释放选择器。

于 2011-05-03T23:35:48.697 回答