ARC下OC物件和CF物件之間的橋接(bridge)
1.__bridge
:CF和OC物件轉化時只涉及物件型別不涉及物件所有權的轉化;
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (CFURLRef)url;
上面的這段程式碼在ARC環境下系統會給出錯誤提示和錯誤修正,修正後如下:
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (__bridge CFURLRef)url;
系統為我們自動新增了__bridge,因為是OC建立的物件並且在轉換時沒有涉及物件所有權的轉換,所以上面的程式碼不需要加CFRelease
2.__bridge_transfer
:常用在講CF物件轉換成OC物件時,將CF物件的所有權交給OC物件,此時ARC就能自動管理該記憶體;(作用同CFBridgingRelease())
3.__bridge_retained
:(與__bridge_transfer相反)常用在將OC物件轉換成CF物件時,將OC物件的所有權交給CF物件來管理;(作用同CFBridgingRetain())
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (__bridge_retained CFURLRef)url;
CFRelease(ref);
當使用_bridge_retained識別符號以後,代表OC要將物件所有權交給CF物件自己來管理,所以我們要在ref使用完成以後用CFRelease將其手動釋放.
複製程式碼
CFStringRef cfString= CFURLCreateStringByAddingPercentEscapes(
NULL,
(__bridge CFStringRef)text,
NULL,
CFSTR("!*’();:@&=+$,/?%#[]"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
NSString *ocString = (__bridge_transfer CFStringRef)cfString;
此時OC即獲得了物件的所有權,ARC負責自動釋放該物件,如果我們在結尾加上CFRelease(cfString)純屬畫蛇添足,雖不會崩潰,但是控制檯會列印出該物件被free了兩次。
相關文章
- ARC下OC物件與CF物件的橋接(__bridge)物件橋接
- __bridge - 橋接橋接
- 2.2 橋接 Bridge橋接
- 橋接模式(Bridge)橋接模式
- [iOS]深入理解__bridge-OC物件與C++物件的引用轉換iOS物件C++
- JAVA設計模式之 橋接模式【Bridge Pattern】Java設計模式橋接
- 設計模式 | 橋接模式(bridge)設計模式橋接
- iOS-OC、Swift混編之橋接檔案iOSSwift橋接
- jQuery物件和DOM物件和字串之間的轉化jQuery物件字串
- jQuery物件和DOM物件之間的轉換實現jQuery物件
- c++涉及模式 橋接模式(bridge Pattern)C++模式橋接
- 《設計模式》 - 6. 橋接模式( Bridge )設計模式橋接
- OC底層原理之例項、類物件、元類物件物件
- Strimzi Kafka Bridge(橋接)實戰之一:簡介和部署Kafka橋接
- OC物件的本質物件
- 設計模式的征途—8.橋接(Bridge)模式設計模式橋接
- Java物件之間的比較之equals和==Java物件
- C#設計模式-橋接模式(Bridge Pattern)C#設計模式橋接
- C#設計模式系列:橋接模式(Bridge)C#設計模式橋接
- 設計模式--橋接模式Bridge(結構型)設計模式橋接
- 設計模式(五)橋接模式Bridge == Pointer To Implementation設計模式橋接
- oc與swift檔案的相互呼叫方式——橋接Swift橋接
- OC:類與物件☀️物件
- 初識OC&iOS 類和物件iOS物件
- 設計模式系列之代理模式(Proxy Pattern)——物件的間接訪問設計模式物件
- C#設計模式(8)——橋接模式(Bridge Pattern)C#設計模式橋接
- [轉] jQuery物件與DOM物件之間的轉換jQuery物件
- Strimzi Kafka Bridge(橋接)實戰之二:生產和傳送訊息Kafka橋接
- java基本型別和物件之間的轉換Java型別物件
- Strimzi Kafka Bridge(橋接)實戰之三:自制sdk(golang版本)Kafka橋接Golang
- 關聯物件的實現原理【OC】物件
- OC原始碼剖析物件的本質原始碼物件
- 重新認識“物件”和“行為”之間的關係物件
- 不同層之間的物件關係物件
- 設計模式之橋接設計模式橋接
- OC物件記憶體佈局物件記憶體
- Swift中橋接標頭檔案建立(Swift 與 OC 的混編)Swift橋接
- OC物件是結構體的驗證物件結構體