7

下面的代碼編譯罰款與手動內存管理,但根據ARC失敗:一個CALayer的內容設置在iOS與ARC一個CGImageRef上

CALayer *layer = [CALayer layer]; 
layer.contents = [[UIImage imageNamed:@"dial.png"] CGImage]; 

的錯誤是:

自動引用計數問題:將 非Objective-C指針類型'CGImageRef'(又名'struct CGImage *')隱式轉換爲 'id',不允許使用ARC

我怎樣才能使用ARC運行?

+1

我沒有使用ARC,但你試過使它成爲* *明確的轉換,它鑄造'( ID)'? – progrmr 2011-12-20 15:39:11

回答

17

的CoreFoundation OBJETS不受ARC管理。 ARC僅適用於Objective-C對象,並且不會隱式知道如何從非對象指針類型轉換(或轉換)時如何轉移所有權。

你需要告訴ARC如何投在客體的所有權轉移:

layer.contents = (__bridge id) [[UIImage imageNamed:@"dial.png"] CGImage]; 
1

只投結果-CGImage的ID,因爲它是抱怨隱式轉換...

layer.contents = (id) [[UIImage imageNamed:@"dial.png"] CGImage]; 
+1

嗯,編譯器確實停止了嘲諷,但是有什麼想法爲什麼這是一個與ARC不禁忌? – cfischer 2011-12-20 15:46:25

+2

因爲'id'代表一個'struct objc_object *',其中'CGImageRef'代表一個'struct CGImage *'(它是一個'struct objc_object *'的封面),它不是'struct objc_object *編譯器不能將非對象(特別是保留在屬性中的對象)隱式轉換爲對象。 – 2011-12-20 15:48:51