Сбой при работе с Mac при построении с помощью Xcode 9.4.1, отлично работает с Xcode 8.3.3

Я пытаюсь перейти на использование Xcode 10 в Mojave, исходя из использования Xcode 8.3.3 в High Sierra. У меня есть значительное приложение, содержащее справедливый бит старого кода (не ARC). Приложение в настоящее время работает в Mac App Store, построенном с 8.3.3 на High Sierra.

Я столкнулся с проблемами с Xcode 10 и Mojave, которые привели меня к кроличьей дыре, поэтому я решил создать резервную копию и ограничить переход на один шаг за раз. В настоящее время я пытаюсь (безуспешно) создавать и запускать с использованием Xcode 9.4.1 на High Sierra.

Используя точно такую ​​же базу кода (новая проверка репо), мое приложение строит и работает отлично, используя Xcode 8.3.3. Он отлично работает с использованием 9.4.1, но сбой при запуске.

Проблема, по-видимому, связана с памятью / подсчетом ссылок. Я всегда получаю сбой, когда приложение пытается показать окно, и трассировка не очень полезна. Отладочный вывод Runtime последовательно указывает, что я отправляю сообщение на освобожденный объект. Вот типичная трассировка стека:

трассировки стека

Всякий раз, когда приложение пытается показать окно, я получаю сообщения, такие как (старое избранное) сообщение, отправленное на освобожденный экземпляр. Я не всегда признаю приемник как одно из моих свойств, поэтому похоже, что это всего лишь симптом, а не причина. Вот типичное сообщение: *** - [NSCalibratedRGBColor release]: сообщение отправлено на освобожденный экземпляр 0x60000605ce60

Я тщетно пытался получить что-либо от диагностики Xcode, например, зомби и малкок. Радиомолчание. Также статический анализатор не сообщает о проблемах. Все, что я могу думать, это то, что ручной подсчет ссылок каким-то образом обрабатывается по-разному с помощью Xcode 9. Я проверил все флаги сборки, чтобы увидеть, изменил ли Xcode 9 что-либо. Без изменений. Я проверил примечания к выпуску и не могу найти упоминания об изменениях в подсчете ссылок.

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

Кто-нибудь еще сталкивался с подобными проблемами и нашел решение? Я что-то пропустил с помощью Xcode 9? Любая помощь очень ценится.

Всего 1 ответ


Спасибо @sdarlington и Willeke за очень полезные ответы. Я, наконец, нашел и исправил проблему. Мне пришлось использовать подход пещерного человека и постепенно удалять вещи из грохота (как вы правильно определили Стефана). Оказывается, это была проблема сохранения / выпуска наследия, которую не обнаружила ни одна диагностика Xcode. Я унаследовал старую графическую структуру, которая не использует ARC. Он объявляет иваров следующим образом:

@interface ColourFiller : NSObject
{
    NSColor*            m_PrimaryColour;
    NSColor*            m_SecondaryColour;
}
...
@end

затем устанавливает их таким образом в методе init:

m_PrimaryColour = [NSColor colorWithCalibratedRed:1 green:1 blue:1 alpha:1];
m_SecondaryColour = [NSColor colorWithCalibratedRed:0 green:0 blue:0 alpha:1];

Обратите внимание на отсутствие ручного удержания. Поэтому я добавил один, и все хорошо:

m_PrimaryColour = [[NSColor colorWithCalibratedRed:1 green:1 blue:1 alpha:1] retain];
m_SecondaryColour = [[NSColor colorWithCalibratedRed:0 green:0 blue:0 alpha:1] retain];

Я понятия не имею, почему Xcode не помешал это, или, действительно, все предыдущие версии build / xcode работали нормально. Этот код долгое время существовал без симптомов. Некоторые изменения библиотеки должны были быть сделаны Apple в Xcode 9, которые, наконец, разоблачили ее.

Еще раз спасибо за вашу помощь - теперь я могу перейти к Xcode 10 и Mojave.


Есть идеи?

10000