Метод CGBitMapContextCreate вызывает предупреждение компилятора Xcode 5 не Xcode 4
Я только что обновил Xcode с версии 4.6.2 до 5.0, а после выполнения метода в моем проекте (созданного в Xcode 4.6.2) неожиданно появляется предупреждение компилятора. Я попытался повторно открыть проект как в старой, так и в новой версиях Xcode, и я подтвердил, что тот же метод не дает никаких предупреждений в 4.6.2.
Вот строка кода, вызывающая предупреждение в Xcode 5.0:
CGContextRef context = CGBitmapContextCreate(NULL, frame.size.width * scaleFactor, frame.size.height * scaleFactor, 8, frame.size.width * scaleFactor * 4, colorSpace, kCGImageAlphaPremultipliedFirst);
И предупреждение говорит:
"Implicit conversion from enumeration type 'enum CGImageAlphaInfo' to different enumeration type 'CGBitMapInfo' (aka 'enum CGBitMapInfo')"
Это не является предупреждением об устаревании, но я недостаточно хорошо знаком с этими классами, чтобы интерпретировать смысл или знать, как его разрешить. Любая помощь приветствуется.
Ответы
Ответ 1
Предполагаемые значения kCGImageAlpha*
enum должны заполнять первые пять бит в CGBitmapInfo
. Однако, поскольку система типа C не может выразить это, вы получаете предупреждение о том, что типы не совпадают, даже если они были предназначены.
Правильное решение - передать значение альфа-перечисления в CGBitmapInfo
, так как это:
(CGBitmapInfo)kCGImageAlphaPremultipliedFirst
Ответ 2
Высказывал комментарий https://github.com/inkling/Subliminal/issues/23, что намерение нового предупреждения XCode может указывать на использование разных масок для этих типов перечислений создавать и конкатенировать различные флаги. Поэтому вместо того, чтобы просто использовать kCGImageAlphaPremultipliedFirst, используйте
(kCGBitmapAlphaInfoMask и kCGImageAlphaPremultipliedFirst)
Предупреждение исчезнет после этого изменения.