在開發ios應用程式時我們有時會用到core foundation物件簡稱cf,例如core graphics、core text,並且我們可能需要將cf物件和oc物件進行互相轉化,我們知道,arc環境下編譯器不會自動管理cf物件的記憶體,所以當我們建立了乙個cf物件以後就需要我們使用cfrelease將其手動釋放,那麼cf和oc相互轉化的時候該如何管理記憶體呢?答案就是我們在需要時可以使用__bridge,__bridge_transfer,__bridge_retained,具體介紹和用法如下
1.__bridge:cf和oc物件轉化時只涉及物件型別不涉及物件所有權的轉化;
nsurl *url = [[nsurl alloc] initwithstring:@"上面的這段**在arc環境下系統會給出錯誤提示和錯誤修正,修正後如下:"];cfurlref
ref = (cfurlref)url;
nsurl *url = [[nsurl alloc] initwithstring:@"系統為我們自動新增了__bridge,因為是oc建立的物件並且在轉換時沒有涉及物件所有權的轉換,所以上面的**不需要加cfrelease"];cfurlref
ref = (__bridge cfurlref)url;
2.__bridge_transfer:常用在講cf物件轉換成oc物件時,將cf物件的所有權交給oc物件,此時arc就能自動管理該記憶體;(作用同cfbridgingrelease())
3.__bridge_retained:(與__bridge_transfer相反)常用在將oc物件轉換成cf物件時,將oc物件的所有權交給cf物件來管理;(作用同cfbridgingretain())
nsurl *url = [[nsurl alloc] initwithstring:@""];cfurlref
ref =(__bridge_retained cfurlref)url;
cfrelease(
ref);
當使用_bridge_retained識別符號以後,代表oc要將物件所有權交給cf物件自己來管理,所以我們要在ref使用完成以後用cfrelease將其手動釋放.
cfstringref cfstring=cfurlcreatestringbyaddingpercentescapes(null,
(__bridge cfstringref)text,
null,
cfstr(
"!*』();:@&=+$,/?%#
"), cfstringconvertnsstringencodingtoencoding(nsutf8stringencoding));
nsstring *ocstring = (__bridge_transfer cfstringref)cfstring;
bridge模式的使用
1.安裝uml utilities和bridge utils 2.將當前使用者加入到uml net組,目的是讓虛擬機器獲得操作網絡卡的許可權,配置完成後最好重啟一下。sudo gpasswd a username uml net 3.新增虛擬網路裝置,在 etc network inte ces後面...
ifndef def endif等巨集使用方法
從 一般情況下,源程式中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是 條件編 譯 有時,希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。條件編譯命令最常見的形式為 ifdef 識別符號 程式段1 else...
Docker自定義bridge網絡卡的使用
1.建立bridge網絡卡 docker network create d bridge my bridge docker network ls 檢視網絡卡 network id name driver scope 05feb2c84b41 bridge bridge local bb8d74913...