Приведение UnsafeRawPointer к CGImage из функции C, которая возвращает CGImageRef Crashes Swift 4 - PullRequest
0 голосов
/ 12 октября 2018

У нас есть межплатформенная библиотека обработки изображений, и есть вызов, который возвращает CGImageRef как UnsafeRawPointer, который мне нужно превратить в CGImage.Я знаю, что вызов работает, так как при использовании его в цели c я могу просто привести, используя (CGImageRef) returnedData к возвращенным данным, и я получаю изображение.Однако, пытаясь использовать его в нашем приложении для iOS с использованием Swift 4, я не могу выполнить его без получения ошибки EXC_BREAKPOINT или BAD_ACCESS.Я пробовал кастовать, используя as! CGImage, а также pointer.load(as: CGImage.self), и оба дают мне один и тот же результат.Я делаю что-то неправильно?Есть ли лучший способ вернуть изображение из кода C, чтобы Swift?Я должен упомянуть, что та же самая функция C принимает CGImageRef в качестве параметра, и передача CGImage вместо этого не вызывает никаких проблем.

1 Ответ

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

Я думаю, что это проблема управления памятью.Например, полученный вами CGImageRef освобождается перед его использованием.Используйте «Продукт»> «Схема»> меню «Редактировать схему», выберите раздел «Выполнить», вкладку «Диагностика» и включите опцию «Объекты-зомби». Затем запустите приложение. Если какой-либо объект используется после освобождения, вы получитесообщение в консоли.

Если это так, то что-то вроде этого должно решить проблему:

// pointer is your UnsafeRawPointer for CGImageRef
let cgImage = Unmanaged<CGImage>.fromOpaque(pointer).takeRetainedValue()

Еще лучше, если вы можете редактировать или переопределять заголовочные файлы для рассматриваемой библиотеки,Вы можете аннотировать функции C, чтобы Swift знал, как правильно обращаться с указателями.

...