У меня есть набор классов, формирующих шаблон декоратора, чтобы я мог выполнять многоуровневое кэширование. У меня есть абстрактный класс, который обеспечивает основную обработку изображений и содержит ряд переопределяемых функций, в которые реализации могут добавлять свою индивидуальную обработку.
При сохранении изображения у меня есть следующий код:
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? Я не могу понять, почему в первую очередь.
Optimization Level
, чтобы точно определить корень проблемы. - person shallowThought   schedule 08.01.2017