一个Objective-C消息被发送到一个释放的'NSThread'对象(僵尸),地址为:
我跟随this answer跟踪我的应用程序EXC_BAD_ACCESS。是的,我有一个僵尸对象。当我试图找出我的代码的哪一行是错误的,我发现所有负责任的图书馆都是基金会。一个Objective-C消息被发送到一个释放的'NSThread'对象(僵尸),地址为:
当我试图做到这一点:
当您在任何保留/释放双击,仪器会告诉你这个地方进行的代码行。
它总是带我到汇编语言的一些代码。
[
我不知道如何跟踪我的错误是这样的...
根据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”。有没有可能是错误是关于按钮和线程?
我觉得有时容易只是让僵尸在方案中的诊断:Break on EXC_BAD_ACCESS in XCode?
你的第一张截图看僵尸是很明显的,但我同意的实际输出是太普通。 我不知道你的应用是关于什么的,但我会寻找更新按钮文本的东西(基于通知?)。
是的,我使用计时器来更新每秒按钮标题。你可以点击按钮来启动/停止它。我已经编辑了我的问题来查看_update文本_代码。也许我应该把它们放到主线程中? – Chien
@Chien我不确定这是否是您的问题,但您应该始终在主线程上更新您的UI。 – halileohalilei
是的。我只是不确定。如果我没有在主线程上更新UI,每次调用方法时都会崩溃。但它随机发生。 – Chien
这很难。请记住,坠机本身是诊断性的;实际的错误发生很久以前。所以,是的,在邮件发送给僵尸的时候,这不是你的代码。但是你的代码早些时候设置了这种情况。你需要尝试反向工作。 – matt
那么,我遇到了类似的情况,我可以肯定地说,基础库没有问题。尝试运行静态分析器https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/debugging_with_xcode/chapters/static_analyzer.html(这不会解决问题,只是第一步)检查潜在的内存泄漏 –
我已经运行了静态分析器,但没有潜在的内存泄漏... – Chien