http://blog.csdn.net/h48582291/article/details/6779202

上一篇转载文章中,提到了id--void*类型不能隐形转换,需要显性调用.但是文章中都没有说怎么显性转换.

一下午找了N多文档,试验了N多次.找到了正确的调用,可是就是编译不过去,刚刚在apple Developper Forums中看到了类似情况.才知道是xcode4.2的版本没有跟上.造成的某些宏找不到,编译报错.

现在说下ARC开启时,id和void*显性转换.

id objc_unretainedObject(CFTypeRef cf); (void * ==> id,无需单独release)

id objc_retainedObject(CFTypeRef cf); (void
* ==> id,需单独release,或使用__weak,如不释放可能造成leak)

CFTypeRef objc_unretainedPointer(id obj); (id ==> void *,CFTypeRef只是obj的一个引用.)

ARC开启时,coreFoundation Type和Foundation类显性转换.(也就是cf type和ns类的转换)

在没有开启ARC时,可以进行强制转换.

在这里引入了3个宏,和__strong,__weak用法一样的(用时放的位置).

__bridge,__bridge_retain,__bridge_transfer,这主要是cf和ns转换用.

__bridge,ARC没有进行retain操作

__bridge_retain,ARC进行retain操作

__bridge_transfer,ARC在操作结束后,进行release操作.类似__weak吧.

看文档说不建议用后2个..容易搞的混淆了..

id my_id;

CFStringRef my_cfref;

NSString *a = (__bridge NSString*)my_cfref;

CFStringRef b = (__bridge CFStringRef)my_id;

英文好的自己看下苹果官方文档

这是一个概括了解ARC的网站

LLVM关于ARC的介绍.个人感觉比apple的有用,详细

发表回复