ARC 型別轉換 顯示轉換 id 和 void

2021-06-21 04:49:33 字數 2273 閱讀 4399

/*

* arc有效時三種型別轉換:*/1

、__bridge

// 轉換 2

、__bridge_retained

// 轉換 3

、__bridge_transfer

// 轉換

// __bridge 轉換 //

// arc無效時對應的**

id obj = [[nsobject alloc] init];

void *p = obj;

id o = p;

[o release];

// 在 arc 有效時

通過 __bridge轉換 id 和 void * 就能夠相互轉換

id obj = [[nsobject

alloc] init];

void*p = (__bridgevoid*)

obj;

ido = (__bridgeid)p;

void*p = (__bridgevoid*)obj;

ido = (__bridgeid)p; /*

* 通過 __bridge 轉換, id 和 void * 就能夠相互轉換。

* 但是轉換為 void * 的 __bridge 轉換,其安全性與賦值給 __unsafe_unretained 修飾符相近,

* 甚至會更低。如果管理時不注意賦值物件的所有者,就會因懸垂指標而導至程式崩潰。

*/// __bridge 轉換 //

/** __bridge_retained 轉換可使要轉換賦值的變數也持有所賦值的物件.

*/// __bridge_retained 轉換 /

// arc 有效時的**

id obj = [[nsobject alloc] init];

void*p = (__bridge_retainedvoid*)obj;

// arc 無效時的**

id obj = [[nsobject alloc] init];

void *p = obj;

[(id)p retain];

// __bridge_retained arc 轉換

void *p = 0;

nslog(@"class=%@", [(__bridge

id)p class]);

/** 變數作用域結束時,雖然隨著持有強引用的變顯obj失效,物件隨之釋放,

* 但由於 __bridge_retained 轉換使變數p看上去處於持有該物件的狀態,

* 因此該物件不會被廢棄。下面我們比較一下arc無效時的**是怎樣的。

*/// arc 無效時的**

void *p = 0;

/** [(id)p retaincount] -> 1

* 即

* [obj retaincount] -> 1

* 物件扔存在

*/nslog(@"class=%@", [(__bridge

id)p class]);

// __bridge_retained 轉換 /

/** __bridge_transfer 轉換提供與 __bridge_retained 相反的動作,

* 被轉換的變數所持有的物件在該變數被賦值給轉換目標變數後隨後釋放。

*/// __bridge_transfer 轉換 /

// arc 有效時的**

idobj = (__bridge_transferid)p;

// arc 無效時的**

id obj = (id)p;

[obj retain];

[(id)p release];

// __bridge_transfer 轉換 /

/** 不使用id型或物件型變數也可以生成、持有以及釋放物件。

* 雖然可以這樣做,但在arc中並不推薦這種方法。

*/// arc中並不推薦這種方法 /

// arc 有效時的**

void *p = (__bridge_retained

void *)[[nsobject alloc] init];

nslog(@"class=%@", [(__bridge

id)p class]);

(void)(__bridge_transferid)p;

// arc 無效時的**

id p = [[nsobject alloc] init];

nslog(@"class=%@", [p class]);

[p release];

// arc中並不推薦這種方法 /

顯示型別轉換

static cast 目標型別 源型別物件 編譯器對源型別和目標型別做相容性檢查,檢查不通過報錯 源型別和目標型別只要在乙個方向上可以做隱式型別轉換,那麼在兩個方向上就都可以做靜態型別轉換 如果將目標型別從源型別的型別轉換建構函式,或者源型別向目標型別的型別轉換運算子函式,被宣告為explicit...

C 中隱式型別轉換和顯示型別轉換

c 支援隱式型別轉換,但前提是不損失資料精度。而c和c 不同的是,即使損失精度也會自動轉換。如 int x double y y 2.7 x y 假使賦值操作真被執行,那麼y值的小數部分將被擷取,x取得值2。這樣就發生了精度損失,或稱窄化轉換。c或c 編譯器允許這樣的賦值,不出一聲就把值給截短 然而...

C 顯示型別轉換

首先說明,該內容主要摘自c stl 開發技術導引。在c語言中,我們一般採用隱式型別轉換,這樣導致的結果是可讀性不高。如下這段 這段 將double型別轉換成了int型別,問題是如果別人來看這段 的時候,別人可能就不知道這種轉換是程式需要的還是編寫 的人不小心寫錯了呢。因此,在c 程式中應盡量使用顯示...