在oc和fc之間進行轉化的時候,主要是物件的歸屬問題。共有兩種方式:
1、使用巨集,可以標識歸屬者從oc到cf,還是從cf到oc。
ns_inline cftyperef cfbridgingretain(id x)2、使用轉化符,如:__bridge,__bridge_transfer,__bridge_retainedns_inline id cfbridgingrelease(cftyperef x)
id my_id;下面以詳細的例子來介紹一下oc和cf在arc下記憶體管理的詳細寫法.下面以cfurlcreatestringbyaddingpercentescapes()函式為例說一下在arc下的寫法和非arc下的寫法。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
非arc模式下的寫法:
#pragma mark – view lifecycle使用instruments檢測,沒有記憶體洩漏。- (void)viewdidload
-(nsstring *)escape:(nsstring *)text
下面把上面工程改為arc模式。
可以看到xcode自動把上面函式轉化為:
#pragma mark – view lifecycle在arc中,cf和oc之間的轉化橋梁是 __bridge,有兩種方式:- (void)viewdidload
-(nsstring *)escape:(nsstring *)text
上面的方法是從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];最後由cf進行記憶體釋放。cfstringref s2 = (__bridge_retained cfstringref)s1;
// do something with s2 // . . .
cfrelease(s2);
上面**等同於:
cfstringref s2 = cfbridgingretain(s1);下面總結一下我們使用arc情況下。oc和cf互相轉化的原則:// . . .
cfrelease(s2);
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處理器只能直...