Objective-C消息被发送到已解除分配的NSThread'对象(僵尸)地址:

时间:2017-02-10 03:53:33

标签: ios objective-c nsthread nszombie

我按照this answer跟踪我的应用 EXC_BAD_ACCESS 。是的,我有一个僵尸物体。当我试图弄清楚我的代码哪一行出错时,我发现所有负责任的图书馆都是基础。

Like this

当我试图这样做时:

  

双击任何保留/释放时,乐器会显示执行此操作的代码行。

总是需要我使用汇编语言编写一些代码。

[assembly language (maybe?)[3]

我不知道如何追踪我的错误......

根据Elike的回答更新。

当我更新按钮的标题时,确实发生了错误。我使用计时器每秒更新按钮标题。您可以点击按钮开始/停止它。并且我使用dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(_auto_duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{});自动运行该方法300次(该错误在300次内随机发生)。

我像这样调用Timer _startcounttimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(StartCountTimerMethod) userInfo:nil repeats:YES];

- (void)StartCountTimerMethod
{
    _startcountbtnsec++;
    NSString *secstring = [NSString stringWithFormat:@"%d", _startcountbtnsec];
    [_startbtn setTitle:secstring forState:UIControlStateNormal];
}

然后点击按钮将调用此方法:

- (void)StartBtnClick:(UIButton *)btn
{
    switch (btn.tag) {
        case 0:
            btn.tag = 1;
            [_startbtn setTitle:@"0" forState:UIControlStateNormal];
            _startcountbtnsec = 0;
            [self StartCountTimerStart];
            NSLog(@"Start!");
            break;

        case 1:
            btn.tag = 0;
            [_startbtn setTitle:@"Start" forState:UIControlStateNormal];
            [self StartCountTimerStop];
            NSLog(@"Stop!");
            break;

        default:
            break;  
    }
}

我无法看到更新按钮文字的任何问题......僵尸对象是" NSThread"。这个bug是否有可能与按钮和线程有关?

1 个答案:

答案 0 :(得分:1)

我发现在方案的诊断中启用僵尸有时会更容易:Break on EXC_BAD_ACCESS in XCode?

看看你的第一个截图僵尸是非常明显的,但我同意实际的输出过于通用。 我不知道你的应用程序是什么,但我会寻找你更新按钮文本的东西(根据通知?)。