Подтвердить что ты не робот

Иногда Swift вызывает неправильный метод

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

Позвольте мне объяснить на скриншотах, что я имею в виду, затем я использую пример проекта CoreData проекта SwiftDDP, который можно найти в Github, но такие проблемы я смог увидеть в своих собственных проектах.

Здесь мы в Todos.swift:74, где вы можете увидеть точку останова, я ожидаю, что следующий вызов должен быть getId() методом класса MeteorClient, потому что он уже был создан:

Снимок экрана 1

После того, как вы видите, как выглядит ping() того же экземпляра:

Снимок экрана 2

Следующие два шага приводят к исключению EXC_BAD_ACCESS:

Снимок экрана 3

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

Моя среда:

  • AppCode OC-145.184.11
  • Версия Xcode 7.2.1 (7C1002)
  • iOS 9.2 SDK
  • Apple Swift версия 2.1.1 (swiftlang-700.1.101.15 clang-700.1.81)

ПРИМЕЧАНИЕ. Здесь я использую AppCode, но такое же поведение, которое я смог увидеть в Xcode, и даже больше, если одна и та же проблема, которая воспроизводится в Xcode, не может воспроизводиться в AppCode и наоборот.

Было бы благодарно, если кто-нибудь сможет объяснить мне это странное поведение.

Спасибо!

4b9b3361

Ответ 1

Это произошло в моей команде, используя Swift 2.2. Это действительно невероятно странно. Это не проблема с резьбой или проблема с асинхронностью, это был очень суровый вариант. Мы назвали метод одного экземпляра, а другой - выше. Я удалил метод, который вызывался, а затем вместо него был вызван тот, который был выше THAT. Затем я переместил метод, который я фактически вызывал в другое место в файле, и выглядело так, что вызывали несколько свойств.

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

Но мы это "решили". Мы переместили метод до кода, который фактически запускался, и после небольшого проб и ошибок был вызван правильный метод. Не уверен, что это проявится для других методов.

Было бы неплохо предоставить простой проект, где это происходит, но кажется маловероятным, что это возможно, и я не могу разделить мгновенный снимок моей базы кода с Apple. Это должен быть прекрасный шторм, чтобы вызвать ошибку со временем выполнения Swift.

Ответ 2

Есть ли у вас несколько потоков? Может быть, сетевой поток?

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

Ответ 3

Когда я переключился на симулятор iPhone 6 вместо iPhone 7, он теперь работает правильно!

Ответ 4

Наше приложение было отклонено из обзора из-за таинственного сбоя. После отладки я обнаружил, что у нее была эта же проблема - но только для схемы Release!

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

Ответ 5

У меня была аналогичная проблема, я думаю. Не удалось увидеть, что вызывалась неправильная функция, но точки останова на вызываемой функции никогда не попадали, и я не мог войти в функцию, из которой она вызывалась. Я добавил новую функцию (я назвал ее wtf) с тем же списком параметров и реализацией, и она работала так, как ожидалось, поэтому она должна была быть странной проблемой связывания в компиляторе Swift.

Обновление: появилась супер-чистка (см. ниже), но это не так. Похоже, я оставляю свою функцию wtf.

После супер-очистки проекта, похоже, что все снова работает как ожидалось:

  • clean (cmd + shift + k)
  • clean build dir (cmd + opt + shift + k)
  • quit XCode
  • удалить производные данные (rm -rf ~/Library/Developer/Xcode/DerivedData/*) С >

FYI, в моем случае, функция, которую я вызываю, находится в общем базовом классе, вызванном из общего подкласса, вызванном специализированным под-подклассом. Как мы все знаем, дженерики по-прежнему очень ошибочны в компиляторе Swift, поэтому, вероятно, я столкнулся с этим.