CF記憶體管理規

2021-06-04 15:11:12 字數 2170 閱讀 9275

在oc和fc之間進行轉化的時候,主要是物件的歸屬問題。共有兩種方式:

1、使用巨集,可以標識歸屬者從oc到cf,還是從cf到oc。

ns_inline cftyperef cfbridgingretain(id x)      

ns_inline id cfbridgingrelease(cftyperef x)

2、使用轉化符,如:__bridge,__bridge_transfer,__bridge_retained

id my_id;    

cfstringref my_cfref;     

…     

nsstring   *a = (__bridge nsstring*)my_cfref;     // noop cast.     

cfstringref b = (__bridge cfstringref)my_id;      // noop cast.     

…     

nsstring   *c = (__bridge_transfer nsstring*)my_cfref; // -1 on the cfref     

cfstringref d = (__bridge_retained cfstringref)my_id;  // returned cfref is +1

下面以詳細的例子來介紹一下oc和cf在arc下記憶體管理的詳細寫法.下面以cfurlcreatestringbyaddingpercentescapes()函式為例說一下在arc下的寫法和非arc下的寫法。

非arc模式下的寫法:

#pragma mark – view lifecycle    

- (void)viewdidload     

-(nsstring *)escape:(nsstring *)text     

使用instruments檢測,沒有記憶體洩漏。

下面把上面工程改為arc模式。

可以看到xcode自動把上面函式轉化為:

#pragma mark – view lifecycle    

- (void)viewdidload     

-(nsstring *)escape:(nsstring *)text     

在arc中,cf和oc之間的轉化橋梁是 __bridge,有兩種方式:

上面的方法是從cf轉化為oc nsstring物件,使用的__bridge_transfer ,物件所有者發生轉變,由cf到oc,最後由arc接管記憶體管理。執行上面的**,用instruments檢測,是沒有記憶體洩漏的。

上面**等同於:

- (nsstring *)escape:(nsstring *)text    

如果將上述**改為:

-(nsstring *)escape:(nsstring *)text    

編譯也會成功,但是這時候用instruments檢測,可以發現記憶體洩漏:

由於cf轉化完oc,沒有自己釋放記憶體,同時也沒有把記憶體管理交給arc,所以出現記憶體洩漏。由於__bridge只是同乙個物件的引用,記憶體的所有權沒有發生變化。

下面在說一下oc到cf的轉化,需要把oc的記憶體管理權釋放掉。

nsstring *s1 = [[nsstring alloc] initwithformat:@"hello, %@!", name];    

cfstringref s2 = (__bridge_retained cfstringref)s1;     

// do something with s2 // . . .     

cfrelease(s2);

最後由cf進行記憶體釋放。

上面**等同於:

cfstringref s2 = cfbridgingretain(s1);    

// . . .     

cfrelease(s2);

下面總結一下我們使用arc情況下。oc和cf互相轉化的原則:

CF997B Roman Digits 這很規律!

我們在研究羅馬數字。羅馬數字只有4個字元,i,v,x,l分別代表1,5,10,100。乙個羅馬數字的值為該數字包含的字元代表數字的和,而與字元的順序無關。例如 v 35,ixi 12 現在求問乙個長度為 nn 的羅馬數字可以有多少種不同的值。n leq 10 9n 1e9 思路 其實沒什麼思路,就是...

ExchangeOnline合規性管理

一 就地電子資料展示和保留 就地電子資料展示允許組織內的授權合規性管理員搜尋整個exchange組織的郵箱資料 預覽搜尋結果,並可以複製到發現郵箱將其匯出到以pst為拓展名的檔案。就地電子資料展示使用的是exchange搜尋建立的內容索引,基於角色的訪問控制 role based access co...

記憶體管理 記憶體管理概述

儲存器的發展方向是高速 大容量和小體積,即儲存器嘗試更高讀寫速度,更大儲存容量,更小物理體積。在計算機中,常見的儲存器有 暫存器,快取,記憶體,硬碟,一般硬碟之類的輔助儲存器又稱外存。在平均讀寫速度上,有 暫存器 快取 記憶體 外存 在單位容量 上,有 外存 記憶體 快取 暫存器 cpu處理器只能直...