2012-03-02 81 views
1

Im遵循一個教程,我不確定如何將此代碼轉換爲在啓用ARC的情況下無誤地運行。iOS 5需要ARC橋接模型

- (void)setHourHandImage:(CGImageRef)image 
{ 
if (image == NULL) { 
    hourHand.backgroundColor = [UIColor blackColor].CGColor; 
    hourHand.cornerRadius = 3; 
}else{ 
    hourHand.backgroundColor = [UIColor clearColor].CGColor; 
    hourHand.cornerRadius = 0.0; 

} 
hourHand.contents = (id)image; 

給我一個錯誤的唯一部分是(id)圖像;

另外

w = CGImageGetWidth((CGImageRef)hourHand.contents); 

(CGImageRef)minHand.contents);給我一個錯誤

感謝

+0

你會得到什麼錯誤? – MobileOverlord 2012-03-02 01:51:15

回答

15

你需要一個__bridge投。

hourHand.contents = (__bridge id)image; 

w = CGImageGetWidth((__bridge CGImageRef)hourHand.contents); 

__bridge鑄告訴ARC這一投不以任何方式影響對象的所有權。備選方案是__bridge_retained__bridge_transfer,通常通過CFBridgingRetain()CFBridgingRelease()函數使用。

+0

因爲我不知道誰應該負責釋放,所以我通常會對橋接感到困惑。你知道如何判斷我是否應該通過所有權嗎? (要知道是否必須cfrelease來源或只是通過所有權,以便弧釋放它) – Pochi 2012-03-02 02:00:14

+1

@LuisOscar:一般來說,所有現有的實例,你要從一個CF類型的一次性(即你在結果的CFTypeRef中沒有調用CFRelease()等),你需要'__bridge'。 'CFBridgingRetain()'等同於'CFRetain()',即它需要與'CFRelease()'平衡。和'CFBridgingRelease()'平衡一個'CFRetain()'/ alloc/copy(通過將所有權交給生成的obj-c對象的ARC)。 – 2012-03-02 03:31:07

+0

哦,我明白了,謝謝你,請牢記它。 – Pochi 2012-03-02 04:38:38