【问题标题】:CGBitMapContextCreate Method Causes Compiler Warning Xcode 5 not Xcode 4CGBitMapContextCreate 方法导致编译器警告 Xcode 5 而不是 Xcode 4
【发布时间】:2013-09-20 18:57:01
【问题描述】:

我刚刚将 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')"

这似乎不是一个弃用警告,但我对这些类不太熟悉,无法解释其含义或知道如何解决它。任何帮助表示赞赏。

【问题讨论】:

标签: ios xcode cgcontext xcode5 cgbitmapcontextcreate


【解决方案1】:

kCGImageAlpha* 枚举值应该填充CGBitmapInfo 中的前五位。但是,由于 C 类型系统无法表达这一点,因此您会收到类型不匹配的警告,即使它们是有意的。

正确的解决方案是将您的 alpha 枚举值转换为 CGBitmapInfo,因为它就是这样:

(CGBitmapInfo)kCGImageAlphaPremultipliedFirst

【讨论】:

    【解决方案2】:

    看到 aegolden 的评论 https://github.com/inkling/Subliminal/issues/23,新 XCode 警告的意图可能是指导您在这些枚举类型上使用不同的掩码来构造和连接各种标志。因此,不要只使用 kCGImageAlphaPremultipliedFirst,而是使用

    (kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst)

    此更改后警告将消失。

    【讨论】:

    • 该表达式仅丢弃类型信息,并且只是碰巧错误地解决了问题(通过隐式向下转换为 int 然后隐式向上转换为 CGBitmapInfo)(kCGmageAlphaPremultipliedFirst 已经只包含在 kCGBitmapAlphaInfoMask 中设置的位)。因此,它是以迂回的方式工作的垃圾代码。如果您想投射,只需投射即可。
    • @nevyn:你说得对,包括kCGBitmapAlphaInfoMask 不会改变参数的值,但该方法要求CGBitmapInfo,所以我认为使用其中的值很好枚举类型。诚然,这是一个风格决定,提醒我自己和未来的维护者,我真正提供的是CGBitmapInfo,还有其他位图信息我可以包括,即使现在我只关心 alpha 信息。也许演员表也适用于该提醒,但我觉得它没有明确使用来自 CGBitmapInfo 的值那么有启发性。
    • 是的,这是一个很好的论点。我不能改变我的反对票,它被锁定了:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多