Objective c 当视图关闭时,performSelectorInBackground会导致随机崩溃

Objective c 当视图关闭时,performSelectorInBackground会导致随机崩溃,objective-c,ios,exc-bad-access,nsthread,nsautoreleasepool,Objective C,Ios,Exc Bad Access,Nsthread,Nsautoreleasepool,我的代码的这一部分出现了一些随机崩溃: -(void) goBack { [self performSelectorInBackground:@selector(addActivityIndicator) withObject:nil]; [self.navigationController popViewControllerAnimated:YES]; } - (void)addActivityIndicator { @a

我的代码的这一部分出现了一些随机崩溃:

-(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必须处理一些数据。为了通知用户正在进行处理,我在导航栏的左侧按钮上添加了一个活动指示器

问题是,有时我会在
addActivityIndicator
方法中获得
exc\u bad\u访问
。频率非常随机,有时XCode在
@autoreleasepool
的末尾显示错误,有时在
self.navigationItem.leftBarButtoniem=barButton行显示错误

我想象有时我的viewController被破坏,但线程仍在运行,并尝试访问不再存在的对象的navigationItem。但我不确定这是否是问题所在,我不知道如何解决它

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

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


谢谢。

您不应该在后台执行UIKit操作。

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

编辑

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

[self addActivityIndicator]

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

您也可以在

之后查看
调度\u我不明白您为什么要这样做。修改要从导航堆栈中删除的视图的导航项有什么意义?因为将出现的视图必须处理一些繁重的内容,并且在该处理完成之前,我当前的视图不会消失。也许有更好的方式来表示…谢谢你的回答。但是,如果我将“addActivityIndicator”代码放在我的goBack函数中,UI将保持冻结状态,ActivityIndicator仅在视图消失时才会出现。正确的方法是什么?谢谢你的回答。但是,如果我将“addActivityIndicator”代码放在我的goBack函数中,UI将保持冻结状态,ActivityIndicator仅在视图消失时才会出现。正确的方法是什么?可能在
viewDidLoad
中添加活动指示器,但将其设置为hidden(hidden是
YES
)。如果要显示活动指示器,请将“隐藏”设置为“否”。