El Método CGBitmapContextCreate Causa una Advertencia del Compilador Xcode 5 no Xcode 4


Acabo de actualizar Xcode de la versión 4.6.2 a 5.0, y después de hacer un método en mi proyecto (creado en Xcode 4.6.2) de repente está dando una advertencia de compilador. He intentado reabrir el proyecto en las versiones antigua y nueva de Xcode, y he confirmado que el mismo método no da advertencias en 4.6.2.

Aquí está la línea de código que provoca la advertencia en Xcode 5.0:

CGContextRef context = CGBitmapContextCreate(NULL, frame.size.width * scaleFactor, frame.size.height * scaleFactor, 8, frame.size.width * scaleFactor * 4, colorSpace, kCGImageAlphaPremultipliedFirst);

Y la advertencia dice:

"Implicit conversion from enumeration type 'enum CGImageAlphaInfo' to different enumeration type 'CGBitMapInfo' (aka 'enum CGBitMapInfo')"

No parece ser una advertencia de desaprobación, pero lo soy no estoy lo suficientemente familiarizado con estas clases como para interpretar el significado o saber cómo resolverlo. Cualquier ayuda es apreciada.

Author: jac300, 2013-09-16

2 answers

Los valores de la enumeración kCGImageAlpha* se supone que llenan los primeros cinco bits en CGBitmapInfo. Sin embargo, dado que el sistema de tipo C no puede expresar esto, recibe una advertencia de que los tipos no coinciden, a pesar de que estaban destinados a hacerlo.

La solución correcta es lanzar su valor alfa enum a CGBitmapInfo, ya que eso es lo que es:

(CGBitmapInfo)kCGImageAlphaPremultipliedFirst
 37
Author: nevyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-12 13:21:43

Vio un comentario https://github.com/inkling/Subliminal/issues/23 por aegolden que la intención de la nueva advertencia de XCode podría ser indicarle que use diferentes máscaras en estos tipos de enumeración para construir y concatenar varias banderas. Así que en lugar de solo usar kCGImageAlphaPremultipliedFirst, use

(kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst)

La advertencia desaparecerá después de este cambio.

 6
Author: CodeBrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-26 03:31:44