上一篇轉載文章中,提到了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的了,圖片另存爲再改名就好了)