Если оператор IF работает нормально на симуляторе, но не на устройстве!

Хорошо, проблема в том, что когда мое приложение работает на симуляторе, оно, кажется, работает нормально. На устройстве, однако, он не обновляет все метки. Я думаю, что ошибка где-то здесь:

- (IBAction)buttonclick1 {  

     self.startDate = [NSDate date];  
     double value = [self Level];  
     double value2 = [self Level2];  


if ((value2 - value) >= 3.0) {

    ifWork.text = @"DONE!";
    ifWork.textColor = [UIColor yellowColor];

    float noSeconds = (float) [self.startDate timeIntervalSinceNow]; 
  }
}

Я новичок в этой игре. То, что я ищу, - это когда кнопка нажата, и сколько времени требуется для того, чтобы событие произошло. Затем я хотел бы использовать это время в расчетах.

Я знаю, что утверждение IF правильно, так как оно работает на симуляторе. Однако на устройстве, когда значение и значение2 отличаются на 3, а затем нажимается кнопка, ничего не происходит (метка ifWork не меняется!).

Любая помощь приветствуется,

Stu

10.11.2009 20:37:13
Вы прошли через код, чтобы убедиться, что оператор if выполняется на устройстве?
Daniel 10.11.2009 20:41:12
Я думаю, что это связано с Discussions.apple.com/thread.jspa?threadID=1685984, хотя я не знаю, как использовать это для моего кода, поскольку он использует числа.
Stumf 10.11.2009 21:40:59
Как объявляются и инициализируются Level и Level2? Какие ценности, по вашему мнению, они имели во время этого звонка?
Stephen Canon 13.11.2009 17:12:53
2 ОТВЕТА
РЕШЕНИЕ

Вы запускали код в отладчике, чтобы увидеть, что происходит? Возможно, если значения зависят от чего-либо, например производительности процессора или сети, вы можете ощутить существенные различия между симулятором и фактическим устройством, поэтому вы не можете быть уверены, что то, что работает на симуляторе, работает на устройстве.

2
10.11.2009 20:44:52
Спасибо за ваш ответ и идеи, код связан со значением, которое постоянно уменьшается. Это не зависит от сети или процессора. Таймер правильный? Этикетка даже не меняется ... что-то не так с этим ЕСЛИ! Стю
Stumf 10.11.2009 21:27:45
Чтобы вычислить прошедшее время, я бы инвертировал вторую метку времени в [[NSDate date] timeIntervalSinceDate: self.startDate]; в противном случае вы получаете отрицательное значение. Если вы поставите точку останова в операторе if (...) и запустите программу на симуляторе, получите ли вы ожидаемые значения?
Alfonso 10.11.2009 21:53:14
Извините, я допустил ошибку в предыдущем посте. Интересный вопрос, конечно, заключается в том, что вы получаете правильные значения на реальном устройстве.
Alfonso 10.11.2009 22:03:30
Попробовал на симуляторе с точкой останова и получил ожидаемые результаты, попробовал еще раз на устройстве, все еще не повезло. Этот ярлык будет указывать, сработал ли IF ... все еще без изменений на "ВЫПОЛНЕНО". Если у вас есть возможность, взгляните на ссылку, указанную выше. Спасибо за всю вашу помощь до сих пор.
Stumf 10.11.2009 23:50:14
Я считаю, что здесь было две проблемы. Во-первых, мой метод сравнения должен был быть EPSILON, а не тот, который я пытался использовать. Другое дело было следующее: Value2 (тот, который не должен обновляться) был настроен так, чтобы метка, в которой он находился, не обновлялась, а само значение - обновлялось. Это означало, что эти два значения никогда не были разделены на 3. Еще раз большое спасибо всем!
Stumf 16.11.2009 20:13:11

Там может быть несколько причин.

  • Результаты Level1 или Level2 могут отличаться на устройстве (использование неинициализированной памяти, которая отличается на устройстве
  • значение2 - значение1 может быть очень близко к 3,0, но чуть меньше (двойные значения часто немного неточны)
  • ifWork может быть неправильно установлен на устройстве (то есть ноль), поэтому ничего не происходит.

Лучшее решение - отладка на устройстве (перебирайте этот код строка за строкой) и проверяйте, верна ли какая-либо из этих вещей.

1
11.11.2009 07:43:51
Разве тот факт, что я использовал> = 3,0, не означает, что точность не так уж важна? Это не должно быть точно 3.0.
Stumf 11.11.2009 23:24:32
Если вы выполнили вычисление, которое вы ожидаете получить 3,0, но результат в двойном случае на самом деле равен 2,99999999999998756, то это имеет значение. Если вас не волнуют крайние случаи, тогда это не имеет значения. Если вам небезразличны крайние случаи, вам может потребоваться использовать> = 2.995 или что-то подобное.
Matt Gallagher 15.11.2009 00:21:13