Выстрел в темноте - Ошибка приложения - PullRequest
0 голосов
/ 22 февраля 2009

Хорошо, так что это будет что-то вроде удара в темноте, если вы не увидите мое приложение!

У меня ошибка. У меня есть класс SwimPool, мое приложение передает пул из табличного представления в подробный вид, где вы можете видеть все поля класса swimPool. Затем вы можете нажать на отдельную деталь, отредактировать ее и затем сохранить. «Исходное» средство пула копируется и передается контроллеру представления, ответственному за фактическое внесение изменений. Если пользователь нажимает сохранить, поля копируются из копии в «оригинал»

switch (self.sectionFromParentTable) {
    case KNameIndex:
        self.thePoolFacility.name = self.thePoolFacilityCopy.name;
        self.thePoolFacility.type = self.thePoolFacilityCopy.type;
        break;

    case KAddressIndex:
        self.thePoolFacility.address = self.thePoolFacilityCopy.address;
        break;

    case KPhoneNumberIndex:
        self.thePoolFacility.phoneNumber = self.thePoolFacilityCopy.phoneNumber;
        break;

    case KWebAddressIndex:
        self.thePoolFacility.webAddress = self.thePoolFacilityCopy.webAddress;          
        break;
    case KPricesIndex:
        self.thePoolFacility.prices = self.thePoolFacilityCopy.prices;
        break;
    case KPoolIndex:
        self.thePoolFacility.pools = self.thePoolFacilityCopy.pools;
    default:
        break;
}

[self.navigationController popViewControllerAnimated:YES];

Могу ли я догадаться об ошибке, которая делает следующее:

  1. Ошибка приводит к выполненным изменениям в поля класса не сохраняются. В частности, класс с именем TimeEntry, в изменяемом массиве с именем Monday в словаре с именем TermTimes в классе с именем pool, а затем в изменяемом массиве с именем Pools.

  2. Это кажется случайным. Иногда это работает отлично. Иногда это нет! Я не могу воссоздать ошибку, только если мне повезет, я могу получить это не сохранить. Я догадываюсь, что это может быть чувствителен ко времени Например, если я ввод расписания для пула часы работы, если я быстро добавлю несколько записей и сохранить его обычно работает отлично. Если я заполню в целом расписание, то это более чем не не сохраняет.

  3. Приложение не падает.

Это бесит попытаться отладить ошибку, которая кажется случайной. Есть какие-нибудь намеки на такую ​​эпическую охоту на насекомых?

Ответы [ 4 ]

2 голосов
/ 22 февраля 2009

Один из лучших способов решения проблемы такого типа (когда она, по-видимому, не может быть надежно воспроизведена) - это вставка регистрационного кода в различные области, где, как вы ожидаете, происходят определенные события. Записывайте места, где могут возникнуть ошибки, записывайте, какие значения вы ожидаете, и что у вас есть, и т. Д. Затем попробуйте, попробуйте, попробуйте, пока не сможете воспроизвести ошибку.

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

Надеюсь, это приведет к появлению новых гипотез о том, как происходит ошибка, и вы сможете надежно воспроизвести ее в отладчике и исправить ее!

Как упоминалось в Duffymo, преступник мог бы быть многопоточным, и это было бы хорошим местом для начала, если вы сознательно используете несколько потоков.

0 голосов
/ 24 февраля 2009

Спасибо за все ваши ответы. Теперь это исправлено.

Для тех, кто заинтересован, я забыл добавить идентификатор ячейки в XIB моего подкласса ячейки.

cellForRow: метод создавал новую ячейку каждый раз. Память заполнилась очень быстро. Затем мне показалось, что мое приложение автоматически пытается избавиться от лишнего, вынуждая другой tableView из режима редактирования и не управляя моими экземплярами должным образом.

Опять это проблема с памятью. Разве это не всегда так!?!

Подсказка была ошибка «один из 101» в консоли, указывающая, что мое приложение использует слишком много памяти. Ох и медленная прокрутка tableView.

0 голосов
/ 22 февраля 2009

Мое предложение - искать ноль. Любой вызов метода для объекта nil просто ничего не делает и возвращает nil, поэтому каждый раз, когда вы ожидаете вызова метода, а это не так, вы должны искать это. (.foo = - это то же самое, что setFoo :, поэтому nil.foo = 1; ничего не будет делать.)

0 голосов
/ 22 февраля 2009

«случайный» и «трудно воспроизводимый» заставляет меня думать, что это проблема, связанная с многопоточностью. Условия гонки очень сложно воспроизвести и отладить. Вам необходимо убедиться, что у вас есть эксклюзивные права на ресурсы, необходимые для выполнения этой операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...