針對記憶體管理問題,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 過載的函式只是...