在iOS中,由于ARC不能夠管理CoreFoundation object的生命周期,那么對于CFObject和NSObject之間的轉換問題,我們需要用到__bridge,__bridge_retained和__bridge_transfer三個轉換關鍵字.對于這個轉換,不是太懂,借鑒一下別人寫的.
1.對于__bridge關鍵字,制作類型轉換,但是不修改對象管理權. ?
2.對于__bridge_retained將ObjectIve-C的對象轉化為CoreFundation對象,同事將對象的管理權交給我們,后續需要使用CFRelease或者相關的方法來釋放對象.
3.對于__bridge_transfer,將CoreFoundation的對象轉化為Objective-c的對象,同時將對象的管理權交給ARC.這個時候ARC就能自動管理內存.
例如,在獲取通訊錄的時候,
//1.獲取聯系人
ABRecordRef person = CFArrayGetValueAtIndex(allPeopleArray, i);
//2.獲取姓名
NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
NSString *firstName = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
//3.獲取頭像的數據
NSData *imageData = (__bridge_transfer NSData *)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail);
需要將CF對象轉化為OC對象,并且需要ARC自動管理內存,這種情況下,就需要用__bridge_transfer來進行橋接.