Код App Store отличается от кода Xcode / устройства на iPhone 3G - PullRequest
9 голосов
/ 12 октября 2011

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

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

Приложение выполняетсяотлично на моем iPhone 4, работает под управлением iOS 5, загружено из App Store.Напомним, что

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

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

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

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

enter image description here

iPhone3G работает Xcode привязанная версия моего приложения:

enter image description here

Редактировать: Это звучит очень похоже на эту проблему: Сборка с 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 ]

7 голосов
/ 12 октября 2011

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

enter image description here

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

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

enter image description here

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

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

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

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

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

1 голос
/ 16 января 2012

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

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

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

  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);

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

размер. Высота 19.000000

2-й размер доступа. Высота 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);

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

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

0 голосов
/ 22 января 2012

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

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

0 голосов
/ 12 октября 2011

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

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

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