2012-03-02 80 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