2010-02-26 2 views
1

Мое приложение было отклонено, поскольку приложение не функционировало при проверке командой iPhone App Review Team. Предполагается, что приложение загружает слова в табличное представление, но не делало этого во время проверки. Однако приложение отлично работает на моем iPhone. Не могли бы вы дать мне какие-либо предложения относительно того, почему приложение будет работать отлично на одном iPhone, но не на iPhone, используемом в процессе обзора?iPhone Tableview не работает для тестеров Apple

Вот технические детали:

  1. Проект был составлен на MacBook Pro под управлением Mac OS X 10.6.2 (10C540)
  2. Xcode версии 3.2.1 64-битный Xcode IDE: 1613.0 Xcode Core: 1614,0 ToolSupport: 1591,0
  3. Base SDK Уровень версии 3.1.3
  4. Оптимизация: быстрый, самый маленький [-Os]
  5. My iPhone является 3GS с 3.1.3 OS

Я подозреваю, что метод - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath не вызывается. Этот метод находится в делегате, который определяется как @interface WordTableViewController: GenericTableViewController, где класс GenericTableViewController определяется как @interface GenericTableViewController: UITableViewController.

Я подозреваю, что это было так, потому что в какой-то момент моей разработки отладка версии релиза на iPhone показала, что - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath не был вызываемый, хотя он вызывается при отладке отладочной версии на одном и том же iPhone. Я разрешил этот вопрос после нескольких дней следствия. Я решил это, просто изменив уровень оптимизации в конфигурации выпуска, а затем изменив его обратно на исходное значение. Это было очень странно для меня.

Для получения последней информации о приложении, я воссоздал конфигурацию распространения, дублируя действующую конфигурацию выпуска. Затем я создал специальную конфигурацию, дублируя эту конфигурацию дистрибутива. Теперь приложение отлично работает на моем iPhone для выпуска, отладки и ad-hoc-распространения. Однако он не работает в Apple.

Ваши комментарии будут ОЧЕНЬ высоко оценены!

ответ

1

Одна вещь, чтобы рассмотреть. NSUserDefaults.

Когда вы делаете ваши тестовые случаи, чтобы у вас есть тестовые случаи, когда UserDefaults являются:

  1. Пусто.
  2. Поврежденные.

Apple будет запускать приложение без каких-либо пользовательских настроек по умолчанию, и, если вы не время от времени очищаете их, тестовая кровать с симулятором и целевым оборудованием будет храниться по умолчанию.

Если вы не используете NSUserDefaults для хранения данных состояния, нам потребуется дополнительная информация.

+0

Спасибо, Стивен. Я не использую NSUserDefaults. Тем не менее, я задаюсь вопросом, имеет ли смысл мой последний комментарий к ответу Брэда. Я считаю, что я, возможно, ушел с чем-то, что мне не разрешили делать. А именно, освобождение NSMutableArray, а затем его повторное заполнение при каждом поиске. Я добавлю код в свой следующий комментарий. (Я почти вне места в этом блоке текста.) – user273565

+0

// Используется для выпуска здесь: [list removeAllObjects]; while (sqlite3_step (statement) == SQLITE_ROW && (limit == NO || [list count] <= INITSEARCHROWS)) { NSMutableArray * columns = [[NSMutableArray alloc] init]; for (int i = 0; i <7; i ++) { Значение NSString *; char * column = (char *) sqlite3_column_text (statement, i); if (column == nil) { value = [[NSString alloc] initWithUTF8String: ""]; } else { value = [[NSString alloc] initWithUTF8String: column]; } [columns addObject: значение]; [value release]; } [list addObject: columns]; [выпуск колонок]; } [sql closeDatabase]; [sql dealloc]; } – user273565

+0

ОК. Большая часть этого выглядит нормально. У меня есть вопрос о том, кто владеет памятью из «sqlite3_column_text (statement, i)»; вызов. Аналогично, [[NSMutableArray alloc] init] действительно должен быть [[NSMutableArray alloc] initWithCapacity: 8]. NSMutableArray НЕ переопределил init, есть вероятность, что какой-то код не будет называться, который действительно должен быть. Кроме того, используйте методы удобства «arrayWithCapacity:», «stringWithUTF8String:». Они удаляют много выпусков из вашего кода и облегчают вашу жизнь. –

0

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

Вы заявляете, что используете iPhone 3G S, который имеет значительно большую память, чем более старые модели iPhone/iPod touch. Если вы можете, самостоятельно проверьте свое приложение на одном из этих старых устройств или найдите кого-то, желающего выполнить бета-тестирование вашего приложения (вы упомянули о том, что у вас работающая рекламная сборка, поэтому вы больше всего для этого). Если вы не можете получить доступ к одному из этих устройств, запустите приложение на своем устройстве с помощью инструмента Memory Monitor (not ObjectAlloc) и обратите внимание на пиковое использование памяти вашего приложения. Если он поднимается выше 20 МБ в любое время, он может получать предупреждения о низкой памяти на более старых устройствах, которые ваше приложение может неправильно обрабатывать. Вы можете искусственно вызывать предупреждения о низкой памяти в симуляторе с помощью Hardware | Имитация памяти Предупреждение также и посмотреть, что происходит.

Если вы используете любые фоновые потоки для обработки, они также могут вызвать недетерминированное поведение. IPhone 3G S имеет гораздо более быстрый процессор, чем предыдущие модели iPhone/iPod, поэтому на вашем устройстве может быть выполнен иной порядок, чем у них. Убедитесь, что вы должным образом блокируете доступ к общим ресурсам и не выполняете обновления пользовательского интерфейса в фоновом потоке.

+0

Большое спасибо! 1) Я очистил старое приложение от своего iPhone. 2) Я не смог заимствовать 3G. Я также не смог найти инструмент под названием «Диспетчер памяти». Вы подчеркнули, что имеете в виду нечто иное, чем «Распределение объектов», поэтому я предположил, что вы имеете в виду «Утечки». (Надеюсь, я правильно понял тебя). Поэтому я использовал Инструменты на моей сборке релизов, пока он работал на моем iPhone. Нет утечек. При запуске приложение использует 610 КБ. Функциональность, которая не работает в Apple, составляет 1,92 МБ. Наиболее интенсивная функция - 6.20MB. В фоновом потоке нет явных обновлений пользовательского интерфейса. – user273565

+0

Тот факт, что настройка оптимизации вообще не срабатывала, говорит мне, что вы правы в том, что вещи могут выполняться в другом порядке. Теперь я просматриваю свой код таблицы. Я подозреваю, что источник данных (измененный массив, являющийся членом базового класса моего табличного представления) может быть связан с проблемой. Когда пользователь выполняет поиск в моем приложении, он заполняет таблицу результатами. Я использовал для выпуска измененного массива, а затем повторно назначал и снова заполнял его каждым поиском. Я просто изменил это и выделил один раз, когда представление загружается, а затем выполняет removeAllObjects и повторно заполняет массив при каждом поиске. – user273565

+0

Я имею в виду инструмент монитора памяти. В «Инструменты» перейдите в библиотеку и перетащите инструмент «Монитор памяти» в свой список инструментов и перезапустите приложение (или выберите его из раскрывающегося списка «По умолчанию»). Считывание, которое оно дает, - это истинное использование памяти вашего приложения (ObjectAlloc и другие скрывают большую часть вашего использования памяти пользовательского интерфейса). –

Смежные вопросы