0

我的这部分代码发生了一些随机崩溃:

-(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_accessinaddActivityIndicator方法。频率非常随机,有时 XCode 在末尾显示错误@autoreleasepool,有时在行self.navigationItem.leftBarButtonItem = barButton;

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

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

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

谢谢。

4

2 回答 2

8

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

于 2012-10-03T19:08:50.233 回答
1

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

编辑

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

[self addActivityIndicator]

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

你也可以看看dispatch_after

于 2012-10-03T19:12:15.110 回答