当视图被解雇时,performSelectorInBackground会导致随机崩溃

时间:2012-10-03 19:05:34

标签: objective-c ios exc-bad-access nsthread nsautoreleasepool

我的代码中有一些随机崩溃:

-(void) goBack {

        [self performSelectorInBackground:@selector(addActivityIndicator) withObject:nil];

        [self.navigationController popViewControllerAnimated:YES];

        }

- (void)addActivityIndicator {
        @autoreleasepool {

            UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];

            UIBarButtonItem * barButton = [[UIBarButtonItem alloc] initWithCustomView:activityView];

            [activityView startAnimating];

            self.navigationItem.leftBarButtonItem = barButton;

        }
    }

当我想退出存在这些方法的屏幕时,另一个ViewController必须处理一些数据。为了通知用户正在进行处理,我在导航栏的左侧按钮中添加了一个活动指示器。

问题是我有时会在exc_bad_access方法中获得addActivityIndicator。频率非常随机,有时XCode会在@autoreleasepool末尾显示错误,有时会在self.navigationItem.leftBarButtonItem = barButton;行显示错误

我想有时候我的viewController会被销毁,但线程仍然在运行,并尝试访问不再存在的对象的navigationItem。但我不确定这是不是问题,我不知道如何修复它。

我在我的项目中使用ARC,这个问题出现在我测试过的所有iOS版本中。

拜托,任何人都可以向我解释发生了什么,我该如何解决这个问题?

感谢。

2 个答案:

答案 0 :(得分:8)

你永远不应该在后台做UIKit。

答案 1 :(得分:1)

通过调用[self performSelectorInBackground:@selector(addActivityIndicator) withObject:nil];,您正在后台线程上更新UI。您应该只更新主线程上的UI。

修改

根据您的评论,您尝试在视图弹出之前更新UI。这样做的方法是:

[self addActivityIndicator]

[navigationController performSelector:@selector(popViewControllerAnimated:) withObject:[NSNumber numberWithBool:YES] afterDelay:0];

您还可以查看dispatch_after