2013-09-16 21 views
24

Ich habe gerade Xcode von Version 4.6.2 auf 5.0 aktualisiert, und nachdem ich eine Methode in meinem Projekt (erstellt in Xcode 4.6.2) gemacht habe gibt plötzlich eine Compiler-Warnung. Ich habe versucht, das Projekt sowohl in der alten als auch in der neuen Version von Xcode wieder zu öffnen, und ich habe bestätigt, dass die gleiche Methode in 4.6.2 keine Warnungen gibt. HierCGBitMapContextCreate Methode Ursachen Compiler Warnung Xcode 5 nicht Xcode 4

ist die Codezeile die Warnung in Xcode Hervorrufen 5.0:

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

Und die Warnung sagt:

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

Es ist kein deprecation Warnung zu sein scheint, aber ich bin nicht mit diesen Klassen ziemlich vertraut genug, um die Bedeutung zu interpretieren oder zu lösen. Jede Hilfe wird geschätzt.

+14

Sie können ersetzen 'kCGImageAlphaPremultipliedFirst' mit' (CGBitmapInfo) kCGImageAlphaPremultipliedFirst'. – Rob

+2

Siehe http://stackoverflow.com/questions/17245787/how-do-i-create-an-alpha-only-bitmap-context/17246355#17246355 – rmaddy

+0

Got it, danke! – jac300

Antwort

37

Die Enumerationswerte kCGImageAlpha* sollen die ersten fünf Bits in CGBitmapInfo füllen. Da das System vom Typ C dies jedoch nicht ausdrücken kann, erhalten Sie eine Warnung, dass die Typen nicht übereinstimmen, obwohl sie beabsichtigt sind.

Die richtige Lösung ist Ihr Alpha-ENUM-Wert zu CGBitmapInfo werfen, denn das ist, was es ist:

(CGBitmapInfo)kCGImageAlphaPremultipliedFirst 
6

Ein Kommentar https://github.com/inkling/Subliminal/issues/23 von aegolden, dass die Absicht der neuen XCode-Warnung Sie dazu bringen könnte, verschiedene Masken auf diesen Enum-Typen zu verwenden, um verschiedene Flags zu konstruieren und zu verketten. Anstatt also nur kCGImageAlphaPremultipliedFirst arbeiten, verwenden

(kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst)

Die Warnung nach dieser Änderung wird verschwinden.

+0

Dieser Ausdruck verwirft nur Typinformationen und behebt das Problem nur versehentlich (durch implizites Downcasting auf int dann implizites Upcasting auf CGBitmapInfo) (kCGmageAlphaPremultipliedFirst enthält bereits nur die in kCGBitmapAlphaInfoMask gesetzten Bits). Also, es ist Junk-Code, der auf Umwegen funktioniert. Wenn Sie casten möchten, müssen Sie stattdessen nur casten. – nevyn

+3

@nevyn: Sie haben recht, dass das Einfügen von 'kCGBitmapAlphaInfoMask' den Wert des Arguments nicht ändert, aber die Methode fragt nach einem' CGBitmapInfo', daher finde ich es gut, einen Wert aus diesem Aufzählungstyp zu verwenden. Dies ist zugegebenermaßen eine stilistische Entscheidung, eine Erinnerung für mich selbst und zukünftige Betreuer, dass das, was ich * wirklich * liefere, eine 'CGBitmapInfo' ist, und es gibt noch andere Bits von Bitmap-Informationen, die ich einbeziehen könnte, auch wenn es mich gerade interessiert über die Alpha-Info. Vielleicht funktioniert die Besetzung auch für diese Erinnerung, aber ich finde es weniger aufschlussreich, als den Wert von 'CGBitmapInfo' explizit zu verwenden. –

+0

Ja, gut, das ist ein gutes Argument. Ich kann meinen Downvote jedoch nicht ändern, er ist gesperrt :( – nevyn