我的代码中有一些随机崩溃:
-(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版本中。
拜托,任何人都可以向我解释发生了什么,我该如何解决这个问题?
感谢。
答案 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