ARC的初了解

2021-06-22 23:16:22 字數 2803 閱讀 1139

針對記憶體管理問題,arc可以幫助管理object-c物件,但是不支援core foundation 物件管理,所以轉換後要注意乙個問題,誰來釋放使用後的物件。本文重點總結一下型別轉換後的的記憶體管理

一 非arc的記憶體管理

手動管理記憶體,使用完轉換的物件,release就可以

// nssting 轉 cfstringref

cfstingref acfstring = (cfstringref)[[nsstring alloc]initwithformat:@「%@」,string];

// ….

cfrelease(acfstring);

// cfstringref轉nssting

cfstringref acfstring = cfstringcreatewithcstring(kcfallocatordefault,

,bytes,nsutf8stringencoding);

nssting *anssting = (nssting *)acfstring;

//….

[ansstring release];

二 arc下的記憶體管理

arc的誕生大大簡化了我們針對記憶體管理的開發工作,但是只支援管理 objective-c 物件, 不支援 core foundation 物件。core foundation 物件必須使用cfretain和cfrelease來進行記憶體管理。那麼當使用objective-c 和 core foundation 物件相互轉換的時候,必須讓編譯器知道,到底由誰來負責釋放物件,是否交給arc處理。只有正確的處理,才能避免記憶體洩漏和double free導致程式崩潰。

根據不同需求,有3種轉換方式

•__bridge                                            (不改變物件所有權)

•__bridge_retained 或者 cfbridgingretain()           (解除 arc 所有權)

•__bridge_transfer 或者 cfbridgingrelease()          (給予 arc 所有權)

1. __bridge_retained 或者 cfbridgingretain()

__bridge_retained 或者 cfbridgingretain()  將objective-c物件轉換為core foundation物件,把物件所有權橋接給core foundation物件,同時剝奪arc的管理權,後續需要開發者使用cfrelease或者相關方法手動來釋放物件。

例子:[cpp] view plaincopyprint?

01. - (void)viewdidload  

02.   

cfbridgingretain()  是 __bridge_retained 的巨集方法,下面兩行**等價:

[cpp] view plaincopyprint?

01. cfstringref acfstring = (__bridge_retained cfstringref) ansstring;  

02. cfstringref acfstring = (cfstringref) cfbridgingretain(ansstring);  

2. __bridge_transfer 或者 cfbridgingrelease()

__bridge_transfer 或者 cfbridgingrelease()  將非objective-c物件轉換為objective-c物件,同時將物件的管理權交給arc,開發者無需手動管理記憶體。

接著上面那個記憶體洩漏的例子,再轉成oc物件交給arc來管理記憶體,無需手動管理,也不會出現記憶體洩漏:

[cpp] view plaincopyprint?

01. - (void)viewdidload  

02.   

cfbridgingrelease() 是__bridge_transfer的巨集方法,下面兩行**等價:

[cpp] view plaincopyprint?

01. ansstring = (__bridge_transfer nsstring *)acfstring;  

02. ansstring = (nsstring *)cfbridgingrelease(acfstring);  

3. __bridge

__bridge 只做型別轉換,不改變物件所有權,是我們最常用的轉換符。

從oc轉cf,arc管理記憶體:

[cpp] view plaincopyprint?

01. - (void)viewdidload  

02.   

從cf轉oc,需要開發者手動釋放,不歸arc管:

[cpp] view plaincopyprint?

01. - (void)viewdidload  

02.   

03.     [super viewdidload];  

04.      

05.     cfstringref acfstring = cfstringcreatewithcstring(null, "test", kcfstringencodingascii);  

06.     nsstring *ansstring = (__bridge nsstring *)acfstring;  

07.      

08.     (void)ansstring;  

09.      

10.     cfrelease(acfstring);  

11. } 

加密初了解

1.對稱式加密1 des d atae ncryption s tandard 安全性較差,一般不建議使用。2 3des 三重des,針對des金鑰長度較短的問題,3des可以實現最少112位 最高168位金鑰長度。3 aes 相比於3des擁有更好的安全性。4 pbe p assword b as...

IP位址初了解

ip分為2中 ipv4 32位 ipv6 128位 ipv6的提出是為了應付未來ip位址不足的困難,但是目前ipv4仍然是主流。乙個ip位址分為4段,每段有8位,段與段之間用 分隔。為了易於表示,ip位址會把沒段的二進位制轉化為十進位制。a 0 x.xx.xx.xx b 10 xx.xx.xx c ...

C 模板初了解

泛型程式設計顧名思義 可以通泛的使用,比如我們要使用乙個add加法函式,void add int a,int b void add double a,double b void add float a,float b 那我們可以通過函式過載來實現,但是函式過載有不好的地方,那就是 1 過載的函式只是...