2013-09-16 16 views
24

Ho appena aggiornato Xcode dalla versione 4.6.2 alla 5.0 e, dopo aver eseguito un metodo nel mio progetto (creato in Xcode 4.6.2), viene improvvisamente visualizzato un avvertimento del compilatore. Ho provato a riaprire il progetto sia nella versione vecchia che in quella nuova di Xcode, e ho confermato che lo stesso metodo non avverte in 4.6.2.CGBitMapContextCreate Metodo Cause Compilatore Avviso Xcode 5 non Xcode 4

Ecco la riga di codice suscitare l'avvertimento in Xcode 5.0:

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

e l'avviso dice:

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

E non sembra essere un avvertimento deprecazione, ma io non sono abbastanza familiare con queste classi per interpretare il significato o sapere come risolverlo. Qualsiasi aiuto è apprezzato.

+14

È possibile sostituire 'kCGImageAlphaPremultipliedFirst' con' (CGBitmapInfo) kCGImageAlphaPremultipliedFirst'. – Rob

+2

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

+0

Capito, grazie! – jac300

risposta

37

I valori di enumerazione kCGImageAlpha* devono riempire i primi cinque bit in CGBitmapInfo. Tuttavia, poiché il sistema di tipi C non è in grado di esprimere ciò, viene visualizzato un avviso che i tipi non corrispondono, anche se erano previsti.

La soluzione corretta è quella di lanciare la vostra valore enum alfa per CGBitmapInfo, dato che è quello che è:

(CGBitmapInfo)kCGImageAlphaPremultipliedFirst 
6

Ho visto un commento https://github.com/inkling/Subliminal/issues/23 da aegolden che l'intenzione del nuovo avviso XCode potrebbe essere l'indirizzamento di utilizzare maschere diverse su questi tipi di enum per costruire e concatenare vari flag. Così, invece di utilizzare kCGImageAlphaPremultipliedFirst, utilizzare

(kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst)

L'avviso scompare dopo questa modifica.

+0

Tale espressione elimina solo le informazioni sul tipo e solo per errore risolve il problema (eseguendo il downcast implicitamente su int e poi implicitamente sull'upcast verso CGBitmapInfo) (kCGmageAlphaPremultipliedFirst contiene già solo i bit impostati in kCGBitmapAlphaInfoMask). Quindi, è un codice spazzatura che funziona in modo indiretto. Se vuoi lanciare, basta cast invece. – nevyn

+3

@nevyn: hai ragione che includere 'kCGBitmapAlphaInfoMask' non cambia il valore dell'argomento, ma il metodo richiede un' CGBitmapInfo' quindi penso che sia bello usare un valore da quel tipo enumerato. Questa è, ammettiamolo, una decisione stilistica, un promemoria per me e per i futuri manutentori che quello che sto * veramente * offrendo è un 'CGBitmapInfo', e ci sono altri bit di informazioni bitmap che potrei includere, anche se in questo momento mi interessa solo circa le informazioni alfa. Forse il cast funziona anche per quel promemoria, ma ritengo che sia meno illuminante dell'uso del valore di 'CGBitmapInfo' in modo esplicito. –

+0

Sì, va bene, questa è una buona argomentazione. Non posso cambiare il mio downvote però, è bloccato :( – nevyn