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

Метод 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')"

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

4b9b3361

Ответ 1

Предполагаемые значения kCGImageAlpha* enum должны заполнять первые пять бит в CGBitmapInfo. Однако, поскольку система типа C не может выразить это, вы получаете предупреждение о том, что типы не совпадают, даже если они были предназначены.

Правильное решение - передать значение альфа-перечисления в CGBitmapInfo, так как это:

(CGBitmapInfo)kCGImageAlphaPremultipliedFirst

Ответ 2

Высказывал комментарий https://github.com/inkling/Subliminal/issues/23, что намерение нового предупреждения XCode может указывать на использование разных масок для этих типов перечислений создавать и конкатенировать различные флаги. Поэтому вместо того, чтобы просто использовать kCGImageAlphaPremultipliedFirst, используйте

(kCGBitmapAlphaInfoMask и kCGImageAlphaPremultipliedFirst)

Предупреждение исчезнет после этого изменения.