dispatch_async在重新使用时崩溃了

时间:2018-01-09 21:54:08

标签: ios objective-c dispatch-async

我使用here的解决方案使titleView clipsToBounds始终为真。

我在我的ViewController中有这个并且它运行良好,但是,如果我通过按后退按钮离开ViewController然后返回,它会在dispatch_async行崩溃。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {

    if([object isEqual:[[self.navigationController.navigationBar subviews] objectAtIndex:2]]) {

        dispatch_async(dispatch_get_main_queue(), ^{

            [[self.navigationController.navigationBar subviews] objectAtIndex:2].clipsToBounds = NO;
            [self.navigationItem.titleView layoutIfNeeded];
        });
    }
}

编辑:

我得到的唯一错误是:Thread 1: EXC_BAD_ACCESS (code=1, address=0x102d8860)

控制台不提供(lldb)

以外的任何信息

2 个答案:

答案 0 :(得分:2)

如果你从viewController出去,你必须removeObserver。

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [self.navigationController.navigationBar.subviews[2]
     removeObserver:self 
     forKeyPath:@"clipsToBounds"];
}

答案 1 :(得分:0)

检查你的块

if (self.navigationController.navigationBar.subviews.count > 1){
…