Код в App Store отличается от кода Xcode/ устройства на iPhone 3G
Я не уверен, как объяснить это. Вчера я отправил обновление одного из моих приложений в магазин. На первом снимке экрана показано, как на моем iPhone 3G работает один конкретный экран с iOS 4.2.1, загруженный из App Store:
И второе изображение ниже точно такой же код, никаких изменений не было сделано с момента первоначальной отправки, работающих на том же устройстве, привязанном через XCode.
Приложение отлично работает на моем iPhone 4 под управлением iOS 5, загруженной из App Store. Итак, резюмируем:
- Приложение, полученное из App Store, имеет недостатки на iPhone 3G
- Приложение, полученное в App Store, хорошо работает на iPhone 4
- Приложение, привязанное через 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]
иначе случится много странных вещей.