一条 Objective-C 消息被发送到一个已释放的“NSThread”对象(僵尸),地址为:

Posted

技术标签:

【中文标题】一条 Objective-C 消息被发送到一个已释放的“NSThread”对象(僵尸),地址为:【英文标题】:An Objective-C message was sent to a deallocated 'NSThread' object (zombie) at address: 【发布时间】:2017-06-28 07:41:36 【问题描述】:

我关注 this answer 来跟踪我的应用程序是否有 EXC_BAD_ACCESS。是的,我有一个僵尸对象。当我试图找出我的代码的哪一行是错误的时,我发现所有的责任图书馆都是基金会。

当我尝试这样做时:

当您双击任何保留/释放时,仪器将向您显示执行此操作的代码行。

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

[

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

根据Elike的回答更新。

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

我这样调用定时器 _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”。这个错误有没有可能是关于按钮和线程的?

【问题讨论】:

这很难。请记住,崩溃本身是诊断性的;实际的错误发生在很久以前。所以,是的,当消息被发送给僵尸时,它不是你的代码。但是您的代码更早地设置了这种情况。您需要尝试向后工作。 嗯,我也遇到过类似的情况,我可以肯定地说,基础库没有问题。尝试运行静态分析器developer.apple.com/library/content/documentation/…(这不会解决问题,只是第一步)检查潜在的内存泄漏 我已经运行了静态分析器,但没有潜在的内存泄漏... 【参考方案1】:

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

看看你的第一张截图,僵尸很明显,但我同意实际输出太笼统了。 我不知道您的应用程序是关于什么的,但我会寻找您更新按钮文本的内容(基于通知?)。

【讨论】:

是的,我使用计时器每秒更新按钮标题。您可以点击按钮来启动/停止它。我已经为 _update a button text _ code 编辑了我的问题。也许我应该把它们放到主线程? @Chien 我不确定这是否是您的问题,但您应该始终在主线程上更新您的 UI。 是的。我只是不确定。如果我没有在主线程上更新 UI,那么每次调用该方法时它都会崩溃。但它是随机发生的。

以上是关于一条 Objective-C 消息被发送到一个已释放的“NSThread”对象(僵尸),地址为:的主要内容,如果未能解决你的问题,请参考以下文章

一条 Objective-C 消息被发送到地址 0x1 处已释放的“__NSDictionaryI”对象(僵尸)

第3章 类对象和方法(Objective-C程序设计)

一条消息怎么被两个消费者消费

Objective-C / 数组中的内存泄漏

Pulsar:如果一条消息被 nack'd (negativeAcknowledge()) 啥时候重新发送?

写入后 NSOutputStream 因访问错误而崩溃(Objective-c)