Некоторые стресс-тесты на моем приложении для Iphone - PullRequest
1 голос
/ 26 февраля 2010

Я провел несколько стресс-тестов в своем приложении для Iphone.Результаты ниже.Мне интересно, если я должен быть обеспокоен, и, если так, что я мог бы сделать с этим.

Я настроил таймер для срабатывания раз в секунду.Всякий раз, когда срабатывает таймер, приложение запрашивает некоторые данные XML с сервера.Когда данные поступили, приложение затем проанализировало данные и снова отобразило уязвимое представление таблицы. В нескольких испытаниях приложение проходило в среднем около 500 раз за цикл до сбоя.

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

Я настроил цикл, чтобы повторно отображать представление таблицы, не загружая ничего.Как только одна перерисовка была завершена, началась следующая.После 2601 цикла приложение перестало работать.

Все вышеперечисленные цифры больше, чем то, что может сделать пользователь.

Кроме того, мое приложение никогда не работает долго, когда я пытаюсь запустить его на устройстве под инструментами.Поэтому я не могу получить полезные данные таким образом.(Но без инструментов это длится довольно долго, как описано выше.)

1 Ответ

2 голосов
/ 26 февраля 2010

Я бы сказал, что вы должны быть очень обеспокоены. Первое правило программирования заключается в том, что пользователь никогда не будет делать то, что вы ожидаете.

Что нужно учитывать:

  • Методы доступа. Используй их. Настроить свойства для всех атрибутов и всегда получать к ним доступ с соответствующие методы получения / установки:

.

object.property = some_other_object;      -OR-
[object setProperty:some_other_object];

и

object = some_other_object.some_property;
object = [some_other_object some_property];

Не поддавайтесь искушению делать такие вещи, как:

property = some_other_object;
[property retain];
  • Получаете ли вы выходные данные из ObjectAlloc? Есть 4 инструмента от утечек памяти, производительность и распределение объектов. Никто из них не загружается?
  • Что вы получаете, когда приложение падает? EXEC_BAD_ACCESS или какая-то другая ошибка?
  • Сбалансированное удержание (выделение или копировать) и выпустить. Это хорошая идея чтобы сохранить все выделения / копии сбалансированными с выпуском / авто-выпуском в тот же метод. Если вы используете свой аксессоры ВСЕ ВРЕМЯ, необходимость делать ручные выпуски редко.
  • Авто-релиз часто будет скрывать настоящий проблема. Это возможно Авто-релиз может маскировать некоторые хитрые выделения проблемы. Дважды проверьте ваше использование autorelease.

ИЗМЕНЕНО (добавлено в зависимости от вашего кода ошибки) На основании вашего вышеуказанного ответа "Программа получила сигнал: 0". Это указывает на то, что вам не хватает памяти. Я бы начал с поиска случаев, когда ваш код выполняет что-то вроде:

myObject = [[MyClass alloc] init];
[someMutableArray addObject:myObject];

и у вас нет «релиза», когда вы помещаете новый объект в массив. Если этот массив будет освобожден, объект myObject станет сиротой, но все равно останется в памяти. Самый простой способ сделать это - выполнить все ваши сообщения "alloc" / "copy". За исключением крайне редких условий, в той же функции должен быть парный «выпуск» / «авторелиз» Чаще всего выше должно быть:

myObject = [[[MyClass alloc] init] autorelease];
[someMutableArray addObject:myObject];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...