2013-09-16 11 views
24

Właśnie zaktualizowałem Xcode z wersji 4.6.2 do wersji 5.0, a po wykonaniu metody w moim projekcie (utworzonym w Xcode 4.6.2) nagle pojawia się ostrzeżenie kompilatora. Próbowałem ponownie otworzyć projekt zarówno w starych, jak i nowych wersjach Xcode, i potwierdziłem, że ta sama metoda nie wyświetla ostrzeżeń w 4.6.2.CGBitMapContextCreate Metoda Przyczyna Ostrzeżenie o kompilatorze Xcode 5 nie Xcode 4

Oto linia kodu wywołania ostrzeżenia w Xcode 5.0:

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

oraz ostrzeżenie mówi:

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

To nie wydaje się być ostrzeżeniem dezaprobata, ale nie jestem dość znane z tymi klasami, aby interpretować znaczenie lub wiedzieć, jak je rozwiązać. Każda pomoc jest doceniana.

+14

Można zastąpić 'kCGImageAlphaPremultipliedFirst' z' (CGBitmapInfo) kCGImageAlphaPremultipliedFirst'. – Rob

+2

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

+0

Rozumiem, dzięki! – jac300

Odpowiedz

37

Wartości wyliczeniowe kCGImageAlpha* mają wypełnić pierwsze pięć bitów w CGBitmapInfo. Jednakże, ponieważ system typu C nie może tego wyrazić, otrzymujesz ostrzeżenie, że typy nie są zgodne, nawet jeśli były zamierzone.

Prawidłowe rozwiązanie jest oddać swoją wartość enum alfa do CGBitmapInfo, ponieważ to co to jest:

(CGBitmapInfo)kCGImageAlphaPremultipliedFirst 
6

Zobaczyłem komentarz https://github.com/inkling/Subliminal/issues/23 przez aegolden, że zamiar nowego ostrzeżenia XCode może spowodować, że użyjesz różnych masek dla tych typów wyliczenia, aby skonstruować i połączyć różne flagi. Więc zamiast tylko za pomocą kCGImageAlphaPremultipliedFirst użyć

(kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst)

Ostrzeżenie zniknie po tej zmianie.

+0

To wyrażenie usuwa tylko informacje o typie i tylko naprawia problem przez pomyłkę (przez niejawny downcasting do int, a następnie niejawnie upcasting do CGBitmapInfo) (kCGmageAlphaPremultipliedFirst zawiera już tylko bity ustawione w kCGBitmapAlphaInfoMask). Tak więc kod śmieciowy działa w sposób okrężny. Jeśli chcesz rzucić, po prostu rzuć. – nevyn

+3

@nevyn: Masz rację, że włączenie 'kCGBitmapAlphaInfoMask' nie zmienia wartości argumentu, ale metoda prosi o' CGBitmapInfo', więc myślę, że dobrze jest użyć wartości z tego wyliczonego typu. Jest to, rzecz jasna, decyzja stylistyczna, przypomnienie dla mnie i przyszłych opiekunów, że to, co naprawdę * dostarczam *, to "CGBitmapInfo", i są jeszcze inne fragmenty informacji bitmapowych, które mogę uwzględnić, nawet jeśli teraz tylko dbam o to o informacji alfa. Być może obsada działa również dla tego przypomnienia, ale uważam, że jest mniej pouczające niż bezpośrednie użycie wartości z 'CGBitmapInfo'. –

+0

Tak, w porządku, to dobry argument. Nie mogę zmienić mojego spadku, ale jest zablokowany :( – nevyn