標籤:
很多時候都會使用到CoreFoundation的函數,其傳回值為CoreFoundation架構的對象,如果想轉換為Foundation架構的對象就可以使用橋接方式來搞定。
範例程式碼:
CFStringRef firstname = ABRecordCopyValue(person, kABPersonFirstNameProperty); CFStringRef lastname = ABRecordCopyValue(person, kABPersonLastNameProperty); NSString *firstName = (__bridge NSString *)(firstname); NSString *lastName = (__bridge NSString *)(lastname);
但是使用這種橋接方式就有可能會出現記憶體泄露。
在ARC模式下使用CoreFoundation的函數都需要考慮到記憶體泄露問題,上面的橋接方式僅僅是將CoreFoundation架構的對象所有權交給Foundation架構來使用,並不能管理該對象的記憶體,如果我們想管理該對象記憶體就使用另外一種橋接方式即可。
範例程式碼:
NSString *firstName = (__bridge_transfer NSString *)(firstname); NSString *lastName = (__bridge_transfer NSString *)(lastname);
總結:
- __bridge type : 將CoreFoundation架構的對象所有權交給Foundation架構來使用,但是Foundation架構中的對象並不能管理該對象的記憶體。
- __bridge_transfer Objective-C type : 將CoreFoundation架構的對象所有權交給Foundation來管理,如果Foundation中對象銷毀,那麼我們之前的對象(CoreFoundation)會一起銷毀。
使用__bridge_transfer Objective-C type這種橋接方式,以後就不用再自己手動管理記憶體了!
iOS-橋接方式