OS OC型別和C型別相互轉換

2021-07-03 14:56:33 字數 1794 閱讀 3143

__bridge:不涉及物件所有關係改變

__bridge_transfer:給予 arc 所有權

__bridge_retained:解除 arc 所有權

形式:(__bridge type)expression;

(__bridge_retained cf_type)expression;

(__bridge_transfer objective-c type)expression;

涉及到被轉換物件指標和轉換物件指標指向的共同記憶體的釋放問題。要小心記憶體洩露;一般__bridge_retained只用於oc物件到非oc物件的轉換;__bridge可以互相轉換;__bridge_transfer只能用於非oc物件到oc物件的轉換。

在arc中,oc物件與非oc物件在強制轉換中,需要使用以上三個關鍵字進行橋接,那麼三個關鍵字各用在什麼情況下呢?詳解如下:

下面一行**

cfstringref s1 = (cfstringref)[[nsstring alloc] initwithformat:@」hello, %d!」, 1];

在arc下面會報編譯問題,並會給出推薦的解決方案:

cfstringref s1 = (__bridge cfstringref)[[nsstring alloc] initwithformat:@」hello, %d!」, 1];

這裡nsstring生成的是oc的物件,記憶體由arc負責。s1是cf的物件,記憶體還是需要自己手動管理。兩個變數轉換時需要新增橋接標識。

上面這種情況下不會crash,也不會有記憶體洩露。因為alloc出來的記憶體會被arc**,這塊記憶體的所有關係沒變。

如果後面加上cfrelease(s1);就會crash,因為這塊記憶體還是歸arc管的,這樣會過度釋放。

修改一下:

cfstringref s1 = (__bridge_retained cfstringref)[[nsstring alloc] initwithformat:@」hello, %d!」, 1];

這種情況下,物件的所有權交給cf物件了。就需要加上cfrelease(s1);進行釋放,否則會產生洩露。

再看下面**:

cfuuidref uu = cfuuidcreate(null);

cfstringref s2 = cfuuidcreatestring(null, uu);

cfrelease(uu);

nsstring* str = (__bridge nsstring*)s2;

nslog(@」str:%@」,str);

cfrelease(s2);

這裡的uu和s2都需要使用cfrelease釋放,因為他們不是oc物件,並且是create出來的記憶體,並且所有權沒有被釋放。

如果改動下面一行**:

nsstring* str = (__bridge_transfer nsstring*)s2;

這時候執行程式

會引起crash,因為s2的所有權已經交給arc中的str了,arc會負責釋放這塊記憶體。

這時候呼叫cfrelease(s2);會造成過度釋放。所以應該把這麼行代給去了。

注:arc模式下,自動**只針對objective-c物件有效,對於使用create,copy,retain等生成的core foundation物件還是需要我們手動進行釋放的,cfrelease().

關於_bridge總結:

(1)oc物件 -> 非oc物件:不涉及物件所有權的轉移,即該記憶體的所有權還是由arc來處理;

(2)非oc物件 -> oc物件:不涉及物件所有權的轉移,即該記憶體的所有權還是由非oc物件來處理;

C 類 型別和其他型別相互轉換

類型別轉換時會出現兩種之間轉換,下面我們說的是類型別 通過類帶乙個引數的建構函式 或者多個引數建構函式,除了第乙個引數後面引數都有預設值時!這樣在其他型別賦值給該類型別物件時會發生隱式轉換。include include using namespace std class test test int...

string型別和char型別相互轉換

概念 string string可以被看成是以字元為元素的一種容器。具有一些成員函式比如begin end 迭代器可以根據他們進行定位,length 函式獲取長度。與char型別不同,string 不一定使用null 0 結束,不能將string直接賦值給char char char 是乙個指標,可...

Python list str型別相互轉換

1 str list s 12345 l list s 結果 1 2 3 4 5 2 list str l 1 2 3 s join l 結果 123 如果list裡的元素是int型而非str型則比較麻煩,還這樣寫會報錯,而在刷題時經常碰到需要將int型的list輸出為str的情況,於是補充以下兩種...