Код в App Store отличается от кода Xcode/ устройства на iPhone 3G

Я не уверен, как объяснить это. Вчера я отправил обновление одного из моих приложений в магазин. На первом снимке экрана показано, как на моем iPhone 3G работает один конкретный экран с iOS 4.2.1, загруженный из App Store:

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

Приложение отлично работает на моем iPhone 4 под управлением iOS 5, загруженной из App Store. Итак, резюмируем:

  1. Приложение, полученное из App Store, имеет недостатки на iPhone 3G
  2. Приложение, полученное в App Store, хорошо работает на iPhone 4
  3. Приложение, привязанное через XCode, хорошо на iPhone 3G

Это не единственные графические несоответствия, но все они связаны с пользовательским кодом UITableViewCell, который не делает ничего, кроме добавления меток на несколько пикселей в каждом каталоге, и с первого дня работал нормально. Я отправил отчет в idp-dts и жду ответа от них, но, поскольку список ожидания обычно составляет неделю или больше, я бы предпочел выяснить это самостоятельно.

Любая помощь / советы / догадки будут очень благодарны!

iPhone 3G работает под управлением App Store версии моего приложения:

iPhone 3G под управлением Xcode привязал версию моего приложения:

Изменить: Это звучит очень похоже на эту проблему: сборка с LLVM и любая оптимизация приводит к сбою приложения при запуске. Клиент, с которым я связывался, использовал iPod Touch второго поколения, единственное другое оборудование, кроме iPhone 3G, которое использует armv6.

Изменить 2: Вот фрагмент кода, который устанавливает границы цветовой шкалы на левой стороне. Кажется, в коде нет ничего подозрительного:

- (void)layoutSubviews {
    CGRect colorViewFrame = self.bounds;
    colorViewFrame.size.width = 6;
    colorViewFrame.origin.y += 3;
    colorViewFrame.origin.x -= 1;
    colorViewFrame.size.height -= 8;

    colorView.frame = colorViewFrame;
    ...
}

4 ответа

Решение

Итак, вот что я нашел в настройках сборки:

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

Так что вот самое интересное. Изменение моего параметра отладки на самый быстрый, самый маленький:

Вызывает проблему на моем устройстве во время работы привязанного в XCode.

Прежде чем подавать заявление в Radar или принимать какие-либо необдуманные решения и отправлять неоптимизированный код в App Store, следует ли мне заняться расследованием чего-то еще? Была ли оптимизация компилятора действительно основной причиной проблем компоновки?

Изменить: И если уровень оптимизации является проблемой, почему оптимизированный код работает должным образом на моем iPhone 4, но не должным образом на моем iPhone 3G?

Редактировать 2: Эта проблема звучит очень похоже на этот ответ: Сборка с LLVM и любая оптимизация приводит к сбою приложения при запуске

Редактировать 3: Слышал от Apple Radar, это известная проблема. Будет исправлено в следующей версии Xcode. Спасибо за всю помощь, ребята!

У меня та же проблема, и я нашел решение этой проблемы.

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

поэтому этот код был в моем подклассе UITableViewCell layoutSubviews:

  NSLog(@"size.height %f", size.height);
  NSLog(@"2nd access size.height %f", size.height);
  _titleLabel.frame = CGRectMake(kLeftSpacer, kSpacerHeight, kTitleWidth ,size.height);
  NSLog(@"after setFrame size.height %f", size.height);

дал в журнале следующее:

size.height 19.000000

2-й доступ size.height 56.00000

после setFrame size.height 56.00000

Итак, мой обходной путь должен был использовать промежуточный идентификатор высоты:

CGFloat height = size.height; 
NSLog(@"size.height %f", size.height);
_titleLabel.frame = CGRectMake(kLeftSpacer, kSpacerHeight, kTitleWidth ,height);
NSLog(@"after setFrame size.height %f", size.height);

и все было хорошо...

Думаю, это не так безопасно, как отключение оптимизаций, но остальная часть моего приложения выглядит нормально... всегда лучше тестировать с выпусками!

Ответ заключается в том, чтобы добавить флаг компилятора -mno-thumb для компиляций armv6, а не добавлять его для компиляций armv7.

Доступно Howto: есть ли способ компилировать для ARM, а не Thumb в Xcode 4?

Если вы добавляете и размещаете представления в ячейке табличного представления, вы должны добавить их в ячейки contentView и использовать self.contentView.bounds вместо self.bounds во всем вашем коде макета.

Вам также нужно позвонить [super layoutSubviews] иначе случится много странных вещей.

Другие вопросы по тегам