Возможно, самый странный EXC_BAD_ACCESS, который я видел в Swift.

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

При сохранении изображения у меня есть следующий код:

func cacheImage(_ key:String, image:UIImage?) {
    if let image = image {
        saveImage(key, image:image)
    } else {
        deleteImage(key)
    }
    backingCache?.cacheImage(key, image:image)
}

func saveImage(_ key:String, image:UIImage) {}

func deleteImage(_ key:String) {}

Вот где это становится странным. При компиляции для выпуска этот код будет генерировать EXC_BAD_ACCESS. Отслеживание его с помощью Zombies показывает, что сообщения отправляются экземплярам UIImage после их освобождения.

Если я попытаюсь получить дополнительную информацию путем компиляции с конфигурацией отладки, EXC_BAD_ACCESS перестанет происходить. Это очень затрудняет отладку.

Я обнаружил, что если я добавлю операторы print(...) следующим образом:

func deleteImage(_ key:String) {
    print("Abstract delete image")
}

EXC_BAD_ACCESS исчезает.

Моя текущая теория заключается в том, что без print(...) Swift агрессивно удаляет экземпляры изображений. Я также помню, что читал что-то об отладке, задерживающей сборку мусора ARC, что объясняет, почему EXC_BAD_ACCESS не возникает при отладке.

Я также обнаружил, что изменение подписи метода на:

open func deleteImage(_ key:String) {}

Также удаляет EXC_BAD_ACCESS.

Кто-нибудь может дать более подробное объяснение, почему возникают зомби EXC_BAD_ACCESS? Я не могу понять, почему в первую очередь.


person drekka    schedule 08.01.2017    source источник
comment
Было бы здорово, если бы вы могли создать уменьшенный проект, который содержит только самый минимум, чтобы показать сбой и поделиться им. Затем вы можете сообщить об ошибке на странице bugs.swift.org (или я сделаю это за вас, если хотите )   -  person Thomas Krajacic    schedule 08.01.2017
comment
Попробуйте другую настройку для параметра сборки Optimization Level, чтобы точно определить корень проблемы.   -  person shallowThought    schedule 08.01.2017
comment
У меня тоже есть эта проблема когда-объект-e">нажмите здесь   -  person devjme    schedule 15.02.2018