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
)。如果要显示活动指示器,请将“隐藏”设置为“否”。