2017-02-10 6 views
0

Я следую за this answer, чтобы отслеживать свое приложение для EXC_BAD_ACCESS. Да, у меня есть объект зомби. Когда я пытаюсь выяснить, какая строка моего кода ошибочна, я обнаружил, что все ответственные библиотеки являются Foundation.Сообщение Objective-C было отправлено на освобожденный объект «NSThread» (зомби) по адресу:

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 раз).

я называю Таймер, как этот _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». Есть ли вероятность, что ошибка связана с кнопкой и потоком?

+0

Это сложно. Имейте в виду, что сама авария является диагностической; фактическая ошибка произошла задолго до этого. Итак, да, в то время, когда сообщение отправляется зомби, это не ваш код. Но ваш код задал ситуацию раньше. Вам нужно попытаться работать назад. – matt

+0

Ну, я был в похожей ситуации, и я могу точно сказать, что нет проблем с библиотеками фондов. Попробуйте запустить статический анализатор https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/debugging_with_xcode/chapters/static_analyzer.html (это не решит проблему, это будет только первый шаг) проверить потенциальную память утечки –

+0

Я запускал статический анализатор, но нет никаких потенциальных утечек памяти ... – Chien

ответ

1

Я считаю, что иногда проще просто включить зомби в диагностике схем игровая: Break on EXC_BAD_ACCESS in XCode?

Глядя на ваш первый скриншот зомби довольно очевидно, но я согласен фактический выход слишком общий характер. Я не знаю, что ваше приложение, но я хотел бы найти что-то, где вы обновляете текст кнопки (на основе уведомления?).

+0

Да, я использую таймер для обновления названия кнопки в секунду. Вы можете нажать кнопку, чтобы начать/остановить ее. Я отредактировал свой вопрос для _update текстового кода кнопки. Может быть, я должен поместить их в основной поток? – Chien

+0

@Chien Я не уверен, что это ваша проблема, но вы должны ВСЕГДА обновлять свой интерфейс в основной теме. – halileohalilei

+0

Да. Я просто не уверен.Если я не обновлял пользовательский интерфейс в основном потоке, он должен срабатывать каждый раз, когда я вызываю метод. Но это случается случайным образом. – Chien