Core Foundation 物件記憶體管理

2021-09-11 21:08:17 字數 1608 閱讀 9238

arc 對於core foundation物件的記憶體管理是無效,需要手動新增cfrelease、cfretain訊息

// 建立 cfstringref 物件

cfstringref strref = cfstringcreatewithcstring(kcfallocatordefault, "hello world", kcfstringencodingutf8);

// 建立

ctfontref fontref = ctfontcreatewithname((cfstringref)@"arialmt", 12, null);

// 引用計數加一

cfretain(strref);

cfretain(fontref);

// 引用計數減一

cfrelease(strref);

cfrelease(fontref);

複製**

對於cfrelease、cfretain可以直觀認為與object-c中的retain、release等價。因此對於底層core foundation物件,依然需要手動引用計數來管理記憶體。

nsstring *string = [nsstring stringwithformat:...];

cfstringref cfstring = (__bridge cfstringref)string;

複製**

只是單純地執行了型別轉換,沒有進行所有權的轉移,也就是說,當string物件被釋放的時候,cfstring也不能被使用了

nsstring *string = [nsstring stringwithformat:...];

cfstringref cfstring = (__bridge_retained cfstringref)string;

...cfrelease(cfstring); // 由於core foundation的物件不屬於arc的管理範疇,所以需要自己release

複製**

使用 __bridge_retained 可以通過轉換目標處(cfstring)的 retain 處理,來使所有權轉移。即使 string 變數被釋放,cfstring 還是可以使用具體的物件。只是有一點,由於core foundation的物件不屬於arc的管理範疇,所以需要自己release。

cfstringref cfstring = cfstringcreate...();

nsstring *string = (__bridge_transfer nsstring *)cfstring;

// cfrelease(cfstring); 因為已經用 __bridge_transfer 轉移了物件的所有權,所以不需要呼叫 release

複製**

所有權被轉移的同時,被轉換變數將失去物件的所有權。當core foundation物件型別向objective-c物件型別轉換的時候,會經常用到 __bridge_transfer 關鍵字

Core Foundation 官方文件翻譯

core foundation框架中常用的隱含型別 使用這些隱含型別時需要自己初始化,自己去釋放記憶體。所以需要記住,在初始化的同時在相應位置釋放。以防出現記憶體問題。1.cfstringref 其他方法用的時候可以檢視文件 void testcfstringref 2 cfarrayref,還有很...

對建立游標對理解

步驟 1 首先經過底層的 編寫已經建立起了了python和資料庫之間的溝通橋梁並封裝成了模組,通過pymysql下的conntent 方法與之建立起了連線,例項物件。pymysql.connect 方法返回的是connections模組下的connection 例項,connect 方法傳參就是在給...

對勾函式 對勾函式

對勾函式是一種類似於反比例函式的一般函式。所謂的對勾函式,是形如 f x ax b x 的函式,是 一種教材上沒有但考試老喜歡考的函式,所以更加要注意和學習。一般的函式影象形似兩個中心對稱的 對勾,故名。當x 0 時,f x ax b x 有最小值 這裡為了研究方便,規定a 0 b 0 也就是當 x...