2013-09-16 98 views
24

我剛剛將Xcode從版本4.6.2更新到5.0,並且在我的項目中執行了一個方法(在Xcode 4.6.2中創建)後突然發出編譯器警告。我已經嘗試在Xcode的舊版本和新版本中重新打開該項目,並且我已經確認在4.6.2中同樣的方法不會提供任何警告。CGBitMapContextCreate方法導致編譯器警告Xcode 5 not Xcode 4

這裏的代碼引發的警告在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')" 

這並不似乎是一個棄用警告,但我不是對這些課程非常熟悉,可以解釋它的含義或知道如何解決它。任何幫助表示讚賞。

+14

你可以用'(CGBitmapInfo)kCGImageAlphaPremultipliedFirst'取代'kCGImageAlphaPremultipliedFirst'。 – Rob

+2

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

+0

明白了,謝謝! – jac300

回答

37

kCGImageAlpha*枚舉值應該填寫CGBitmapInfo的前五位。但是,由於C類型系統無法表達這種情況,因此即使它們是有意的,也會發出類型不匹配的警告。

正確的解決辦法是將您的阿爾法枚舉值轉換爲CGBitmapInfo,因爲這是它是什麼:

(CGBitmapInfo)kCGImageAlphaPremultipliedFirst 
6

看到一條評論https://github.com/inkling/Subliminal/issues/23 aegolden新的XCode警告的意圖可能是指示您在這些枚舉類型上使用不同的掩碼來構造和連接各種標誌。因此,而不是僅僅使用kCGImageAlphaPremultipliedFirst,使用

(kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst)

警告將這一變化後消失。

+0

該表達式只丟棄類型信息,並且只發生錯誤修復問題(通過隱式向下轉換爲int,然後隱式向上轉換爲CGBitmapInfo)(kCGmageAlphaPremultipliedFirst已經只包含在kCGBitmapAlphaInfoMask中設置的位)。所以,這是垃圾代碼,以迂迴的方式工作。如果你想施放,只需施放。 – nevyn

+3

@nevyn:你說得對,包括'kCGBitmapAlphaInfoMask'不會改變參數的值,但該方法要求'CGBitmapInfo',所以我認爲使用該枚舉類型的值是很好的。無可否認,這是一個風格化的決定,爲我自己和未來的維護者提供了一個提醒,我真正*提供的是一個'CGBitmapInfo',並且還可以包含其他位圖信息,即使現在我只關心關於alpha信息。也許演員陣容也適用於這個提醒,但我覺得它比明確使用'CGBitmapInfo'中的值更沒有啓發性。 –

+0

是的,這是一個很好的論點。我不能改變我的downvote,但它被鎖定:( – nevyn