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;
苹果官方文档pdf版(附件是pdf的,但是论坛有格式限制.就改成gif的了,图片另存为再改名就好了)