ARC下OC物件與CF物件橋接

2021-06-20 23:40:09 字數 1373 閱讀 2505

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

__bridge_transfer:給予 arc 所有權

__bridge_retained:解除 arc 所有權

在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().

ARC下OC物件和CF物件之間的架橋

core foundation框架 corefoundation.framework 是一組c語言介面,它們為ios應用程式提供基本資料管理和服務功能。core foundation框架和foundation框架緊密相關,它們為相同功能提供介面,但foundation框架提供objective c介...

OC大話ARC與物件的生命週期

函式在返回值得時候,會將其內部變數全部清空釋放 由alloc new copu mutablecopy方法返回值取得的物件自己持有,物件預設修飾符為 strong 除了2中所生成的物件,其他都是非自己生成但是自己持有的物件 物件在沒有明確指定修飾符時,預設為 strong void test 函式呼...

OC 物件與函式

oc物件與函式有著本質的區別 1 方法的實現只能寫在 implementation end 中,物件方法的宣告只能寫在 inte ce end中間 2 物件方法都以 號開頭,類方法都以 號開頭 3 物件方法只能由物件來呼叫,類方法只能由類來呼叫,不能當做函式一樣呼叫 4 函式屬於整個檔案,可以寫在檔...